Чтение из консоли: оператор >> для перечисления внутри класса шаблона - PullRequest
1 голос
/ 09 января 2012

Описание проблемы довольно простое ... У меня есть перечисление, помещенное в шаблонный класс (который я предпочитаю), и для моего приложения я должен быть в состоянии определить функцию operator >> () дляэто перечисление ...

Это, однако, создает проблему в Visual Studio, когда оптимизирующий компилятор Microsoft C / C ++ перестает работать.Другими словами: «Произошла внутренняя ошибка в компиляторе»

Пример кода, который воспроизводит ошибку:

#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 голосов
/ 09 января 2012

Кажется, это работает:

 #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 );
    }
0 голосов
/ 09 января 2012

test.cpp: в функции 'std :: istream & operator >> (std :: istream &, enum S :: X &)':
test.cpp: 16: ошибка: 'template struct S'используется без параметров шаблона

Вам необходимо изменить x = S::X(a); на x = S<U>::X(a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...