考虑:
template <size_t >
class SizeFlag {};
template <size_t START, size_t END>
void asd(SizeFlag<START>, SizeFlag<END>) {
}
template <size_t START>
void asd(SizeFlag <START>, SizeFlag<START + 1>) {
}
template <class T>
class TypeFlag{};
template <class T,class F>
void qwe(TypeFlag<T>,TypeFlag<F>){}
template <class T>
void qwe(TypeFlag<T>,TypeFlag<T*>){}
int main()
{
asd(SizeFlag<1>{}, SizeFlag<2>{});// call to 'asd' is ambiguous in clang-11
qwe(TypeFlag<int>{}, TypeFlag<int*>{});// use void qwe(TypeFlag<T>,TypeFlag<T*>)
cout << "Hello CMake." << endl;
return 0;
}
为什么是 qwe(TypeFlag<T>,TypeFlag<T*>)
比qwe(TypeFlag<T>,TypeFlag<F>)
更专业,但是 void asd(SizeFlag <START>, SizeFlag<START + 1>)
不比void asd(SizeFlag<START>, SizeFlag<END>)
更专业?
最佳答案
“更专业”适用于您的类模板,而不是您编写的函数。函数是重载的,并且不像类的部分特化那样“相关”。
你没有写类似的东西
template <size_t START>
void asd<>(something something) {
}
也就是说,没有 <>
在你的第二个函数中。是只是重载 , 不是同一模板的特化。确定函数参数是否更好匹配的规则是类似
T
的规则。对比 T&
,并且不要认为第二个函数的模板参数比第一个少。完整规则可在https://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading查看。
关于c++ - 非类型模板函数重载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69224943/