首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非类型模板函数重载问题

非类型模板函数重载问题
EN

Stack Overflow用户
提问于 2021-09-17 14:16:53
回答 1查看 74关注 0票数 4

考虑一下:

代码语言:javascript
复制
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>)专门化

EN

回答 1

Stack Overflow用户

发布于 2021-09-17 14:34:06

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

你没有写出像这样的东西

代码语言:javascript
复制
template <size_t START>
void asd<>(something something) {
}

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

判断函数参数是否更匹配的规则是TT&,不要认为第二个函数的模板参数比第一个函数的模板参数少。

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69224943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档