在模板专用化和重载 C++ 方面没有预期的歧义
not getting expected ambiguity on template specialization and overloading c++
>考虑
Class Wow{
public:
//main metod
template<typename T>
void foo(T t){
cout << t << endl;
}
template<>
void foo<int>(int t){
cout << "specialization" << endl;
}
void foo(int t){
cout << "overloading" << endl;
}
}
主要的是
Wow wow;
wow.foo(2.2);
wow.foo(1);
此输出
2.2
overloading
我的问题是为什么还要编译?实际上,foo
的定义是void foo(int)
的两倍。
1)为什么会通过?
2)为什么编译器选择重载的?
谢谢
1)因为这里没有问题。有模板函数、函数模板专用化和重载。您可以像这样调用模板专用化:
wow.foo<int>(3);
2)重载比模板专用化有更好的匹配,如果编译器可以用arg调用这个函数。
N4926 13.3.3/1.7
根据这些定义,可行的函数 F1 被定义为 如果对于所有参数,则比另一个可行的函数 F2 更好的函数 i, ICSi(F1) 不是比 ICSi(F2) 更糟糕的转换序列,并且 然后
F1 不是函数模板专用化,F2 是函数 模板专业化
相关文章:
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- ifstream什么都没读
- 构造对象的歧义
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- 增强精神 X3:错误:在"..."中没有名为"大小"的类型
- 数组初始值设定项的构造函数歧义
- 消除好友和成员二进制运算符的歧义
- 多线程比没有线程C++慢
- 用' . '代替' :: '会在C++中造成歧义吗?
- 为什么下面带有非常量转换函数的代码没有歧义?
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- 您可以在没有线程的情况下同时运行多个 ISR 吗?
- 如何读取没有数组或结构的 3 列文件
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 为什么我的代码在指针方面停止运行?
- 你如何使std::变体的使用更"palatable",语法方面?
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 我需要 c++ 结构方面的帮助
- 在模板专用化和重载 C++ 方面没有预期的歧义