【发布时间】:2015-08-13 09:36:27
【问题描述】:
我正在学习 SFINAE,这是我第一次尝试仅针对可以使用 std::ostream 输出的那些类型打印“YES”(暂时忘记 std::operator<<(std::ostream &, T)...):
template <typename T>
void f(const T &) { std::cout << "NO" << std::endl; }
template <typename T, int SFINAE = sizeof(static_cast<std::ostream &(std::ostream::*)(T)>(
&std::ostream::operator<<))>
void f(const T &) { std::cout << "YES" << std::endl; }
尽管它们似乎与 f(std::vector<int>()) 一起工作(产生“否”),但编译器抱怨 f(0) 模棱两可:http://ideone.com/VljXFh
prog.cpp:16:5: error: call of overloaded 'f(int)' is ambiguous
f(0);
^
prog.cpp:6:6: note: candidate: void f(const T&) [with T = int]
void f(const T &) { std::cout << "NO" << std::endl; }
^
prog.cpp:10:6: note: candidate: void f(const T&) [with T = int; int SFINAE = 8]
void f(const T &) { std::cout << "YES" << std::endl; }
^
如何修复我的代码? “YES”版本不比“NO”版本更具体吗?
澄清
所有f(0)、f(0.) 和f(true) 都失败并出现相同的“模棱两可”错误。我正在寻找一种适用于std::ostream::operator<< 接受的所有类型的解决方案。理想情况下,它不应该依赖于定义“污染”命名空间的辅助类型。
【问题讨论】:
标签: c++ c++11 template-meta-programming sfinae overload-resolution