非类型模板函数重载问题



考虑:

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) {
}

也就是说,在第二个函数中没有<>。它只是重载了,而不是相同模板的专门化。

确定函数参数是否是更好匹配的规则类似于TT&,并且不要考虑第二个函数的模板参数比第一个少。

完整的规则可以在https://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading

相关内容

  • 没有找到相关文章

最新更新