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)
我想知道为什么会发生这种情况,可能的原因是:
提前致谢
你的方法没有也无法奏效.你不能推断出"基于元素的容器"!
对于一个简单的论证,请考虑这个思想实验:
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),我们应该如何推断Foo或Bar?