c++ - 非类型模板函数重载问题

标签 c++ overload-resolution function-templates-overloading

考虑:

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/

相关文章:

c++ - 字符串文字左值和右值引用的函数重载

C++ 入门第 5 版。函数模板重载

c++ - 如何从 vector 类派生

c++ - 尝试在 Qt 中继承 QLCDNumber 的问题

c++ - 具有可变浮点精度的 CString.Format

c++ - 通用引用与非模板 `const&`

c++ - 学习 C,我的编译器已经知道 bool (Visual Studio 2017)

c++ - 模板重载解决问题

c++ - 什么是可变参数函数模板重载优先规则?