在以下代码中产生(LiveExample):
类模板指针
类模板指针
模板指针
大小为10的模板数组
#include <iostream>
#include <utility>
#include <type_traits>
template <class TVar>
class CVar
{
public:
void classTemplate(TVar *) const
{
std::cout << "Class template pointer\n";
}
template<unsigned sz>
void classTemplate(TVar(&)[sz]) const
{
std::cout << "Class template array with size " << sz << "\n";
}
};
template<typename T>
void regTemplate(T)
{
std::cout << "Template pointer\n";
}
template<typename T, unsigned sz> void regTemplate(T(&)[sz])
{
std::cout << "Template array with size " << sz << "\n";
}
int main()
{
unsigned int test[10] = {};
CVar<unsigned> *cFoo = new CVar<unsigned>();
cFoo->classTemplate(&test[0]);
cFoo->classTemplate(test);
regTemplate(&test[0]);
regTemplate(test);
}
为什么当我在类中重载模板时,它无法解析所需的功能-也就是说,调用cFoo->classTemplate(test);
时,响应将是Class template array with size 10
?
如何在不更改cFoo->classTemplate(test);
的情况下在1中获得期望的结果?请注意,void CVar<TVar>::classTemplate(TVar(&)[sz]) const
可能会根据需要更改
答案 0 :(得分:2)
在其他条件相同的情况下,重载分辨率更喜欢非模板而不是模板。在classTemplate
中,一个重载是一个函数模板,而另一个重载是一个非模板成员函数。
在regTemplate
情况下,它们都是函数模板:选择一个采用数组的模板是因为它更加专业。确实,如果您将第一个重载更改为T*
,则通话将变得模棱两可。