【发布时间】:2017-07-27 13:21:48
【问题描述】:
我想使用模板定义 operator<< 的特化,但如果它已经为某些数据类型定义,我不希望它破坏该运算符的行为。
enum State {Open, Locked};
enum Input {Coin, Push};
std::string ToString(State c){
switch (c) {
case Locked : return "Locked";
case Open : return "Open";
}
}
std::string ToString(Input c){
switch (c) {
case Coin : return "Coin";
case Push : return "Push";
}
}
template<typename T> //obviously, a bad idea
std::ostream& operator<<(std::ostream& s, T c) {
return s<<ToString(c);
}
稍后在我想使用的代码中:
int main() {
std::cout<<Coin<<std::endl;
std::cout<<Open<<std::endl;
std::cout<<std::string("normal string")<<std::endl;
}
不出所料,上面给出了编译错误:
error: ambiguous overload for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::string {aka std::basic_string<char>}’)
std::cout<<std::string("normal string")<<std::endl;
(更多关注)
问:如果函数/运算符已经有定义,如何告诉编译器忽略模板?
【问题讨论】:
-
SFINAE on
decltype(ToString(c))
标签: c++ templates operator-overloading overloading