gpt4 book ai didi

c++ - 模板构造函数重载问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:12 26 4
gpt4 key购买 nike

我有一个包含三个构造函数的类模板,其中一个是函数模板。

template<class T>
class TemplateOverLoading
{
public:
TemplateOverLoading(void){};
~TemplateOverLoading(void){};
//constructor that take reference
TemplateOverLoading(std::string& qName, T& qValue )
: mName(qName),
mValue( &qValue)
{
std::cout << "Reference -> "<< *mValue <<"\n";
}

//Template constructor that takes array
template<class T, int N>
TemplateOverLoading(std::string& qName, T (&t)[N])
: mName(qName),
mValue(t)
{
std::cout << "Array ->\n";
for(int i = 0; i < N; i++)
std::cout<< mValue[i];
std::cout << std::endl;
}

//Other constructor that take pointer
TemplateOverLoading(std::string& qName, T* qValue )
: mName(qName),
mValue( qValue)
{
std::cout << "Pointer "<< *mValue <<"\n";
}
private:
T* mValue;
//T* mValueArray;
std::string& mName;
};

在我的应用程序中,我需要区分引用类型/值、指针和数组并执行特定操作。因此我决定使用不同的构造函数。

我正在尝试以下列方式调用构造函数:

int init(10);
int intArray[10] = {0,1,2,3,4,5,6,7,8,9};
TemplateOverLoading<int> mInt(std::string("mInt"), init);
TemplateOverLoading<int> mIntArray( std::string("mIntArray"), intArray );

问题是如果定义了带有指针的构造函数,则永远不会调用数组构造函数。但是,如果我评论其中一个,它会按原样打印数组。

输出:

(when pointer constructor is present)
Reference -> 10
Pointer 0

(when pointer constructor is not present)
Reference -> 10
Array ->
0123456789

所以从句法上来说,推导数组大小 N 是可能的并且是正确的。

显然,当存在数组构造函数时,我混淆了编译器。因此,我没有让编译器自动推导,而是尝试为数组构造函数指定模板参数,只发现与常规函数不同,模板参数不能具体指定。

我想在数组构造函数中引入一个虚拟参数来区分重载,但它看起来不太好。

有没有其他方法可以解决这个问题?任何线索表示赞赏。

最佳答案

将指针构造函数参数设为 T*& qValue

TemplateOverLoading(std::string& qName, T*& qValue )
: mName(qName),
mValue( qValue)
{
std::cout << "Pointer "<< *mValue <<"\n";
}

通过使其成为对指针的引用,可以防止数组到指针的衰减并选择数组构造函数。

另外,我没有看到你的代码是如何编译的,我看到了很多错误:

你的模板构造函数有一个参数class T,这与类模板的class T冲突:

template<class T, int N>
TemplateOverLoading(std::string& qName, T (&t)[N])

这需要更改为 class T 以外的内容,例如 class U:

template<class U, int N>
TemplateOverLoading(std::string& qName, U (&t)[N])

您的构造函数也采用非常量 左值引用,非常量引用不能绑定(bind)到您在构造函数调用中传递的临时对象,即 std::string("mIntArray")。您需要将其更改为 const std::string& 或按值获取。您的成员 std::string& mName; 也是一个引用,您应该删除那里的 &

关于c++ - 模板构造函数重载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15193957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com