4

考虑:

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

4

1 回答 1

-2

“更专业”适用于您的类模板,而不是您编写它们的功能。这些函数是重载的,并且不像类的部分特化那样“相关”。

你没有写类似的东西

template <size_t START>
void asd<>(something something) {
}

也就是说,<>您的第二个功能中没有。它只是重载,而不是同一模板的特化。

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

完整规则见https://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading

于 2021-09-17T14:34:05.640 回答