C++模板和重载运算符

Cem*_*ncu 0 c++ enums templates

我遇到了一些奇怪的行为.我不确定这是否有效.请注意,我并不是想让它发挥作用,我更关心理论方面.我正在使用Visual C++ 2010.请注意以下代码

template <class T_>
ostream &operator <<(std::ostream &out, 
        typename SequenceCheckResult<T_>::directiontype const &direction) {

    switch(direction) {
    case SequenceCheckResult<T_>::None:
        out<<"none o";
        break;
    case SequenceCheckResult<T_>::Horizontal:
        out<<"horizontal _";
        break;
    case SequenceCheckResult<T_>::Vertical:
        out<<"vertical |";
        break;
    case SequenceCheckResult<T_>::ForwardDiagonal:
        out<<"forward diagonal \\";
        break;
    case SequenceCheckResult<T_>::BackwardDiagonal:
        out<<"backward diagonal /";
        break;
    }

    return out;
}
Run Code Online (Sandbox Code Playgroud)

显然,模板类SequenceCheckResult包含一个名为directiontype的枚举.现在上面的代码没有实例化,并且打印了变量的整数值.即使我提供专业化,它仍然无效.如果我创建以下函数,则使用它并打印文本值.请注意,上述函数的以下代码和int特化仅按template<>行和<int>后续不同operator <<.

ostream &operator << (std::ostream &out, 
         SequenceCheckResult<int>::directiontype const &direction) {

    switch(direction) {
    case SequenceCheckResult<int>::None:
        out<<"none o";
        break;
    case SequenceCheckResult<int>::Horizontal:
        out<<"horizontal _";
        break;
    case SequenceCheckResult<int>::Vertical:
        out<<"vertical |";
        break;
    case SequenceCheckResult<int>::ForwardDiagonal:
        out<<"forward diagonal \\";
        break;
    case SequenceCheckResult<int>::BackwardDiagonal:
        out<<"backward diagonal /";
        break;
    }

    return out;
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会发生这种情况,可能的原因是:

  • 编译器错误
  • 实现定义了此行为
  • 标准定义了这种行为
  • 我错过了什么

提前致谢

Ker*_* SB 6

你的方法没有也无法奏效.你不能推断出"基于元素的容器"!

对于一个简单的论证,请考虑这个思想实验:

struct Foo { typedef int type; }
struct Bar { typedef int type; }

template <typename T> void deduce_me(typename T::type n) { }
Run Code Online (Sandbox Code Playgroud)

现在,如果我打电话deduce_me(5),我们应该如何推断FooBar