从控制台读取:运算符>>对于模板类中的枚举

时间:2012-01-09 12:50:58

标签: c++ templates visual-c++ enums

问题的描述非常简单......我在模板类中放置了一个枚举(我更喜欢它),对于我的应用程序,我需要能够定义运算符>>()函数这个枚举...

然而,这会在Microsoft C / C ++优化编译器停止工作的Visual Studio中产生问题。换句话说:“编译器中出现了内部错误”

重现错误的示例代码:

#include <iostream>
#include <stdexcept>

template <typename T>
struct S{
    enum X { X_A, X_B, X_C };
    template <typename U>
    friend std::istream& operator>>(std::istream& in, enum S<U>::X& x);
};

template <typename U>
std::istream& operator>>(std::istream& in, enum S<U>::X& x)
{
    int a;
    in >> a;
    x = S::X(a);
    return in;
}

int main()
{
    S<int> s;
    S<int>::X x = S<int>::X_A;
    std::cout << "Input: ";
    std::cin >> x;
    std::cout << "Output: " << x << std::endl;
}

任何帮助解决这个问题都将非常感谢! 我自己会猜测,因为这个类是模板化的,枚举会以某种方式多次定义......

2 个答案:

答案 0 :(得分:0)

  

test.cpp:在函数'std :: istream&amp;运算符&gt;&gt;(std :: istream&amp;,enum S :: X&amp;)':
  test.cpp:16:错误:'模板结构S'没有模板参数使用

您需要将x = S::X(a);更改为x = S<U>::X(a)

答案 1 :(得分:0)

这似乎有效:

 #include <iostream>

    template< typename T >
    struct S
    {
      enum X
      {
       X_A, X_B, X_C
      };

      friend std::istream& operator>>( std::istream& in, typename S< T >::X & x )
      {
       int a;
       in >> a;
       x = S< T >::X( a );

       return in;
      }
    };

    int main( void )
    {
     S< int > s;
     S< int >::X x = S< int >::X_A;
     std::cout << "Input: ";
     std::cin >> x;
     std::cout << "Output: " << x << std::endl;     
     return( 0 );
    }