问题的描述非常简单......我在模板类中放置了一个枚举(我更喜欢它),对于我的应用程序,我需要能够定义运算符>>()函数这个枚举...
然而,这会在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;
}
任何帮助解决这个问题都将非常感谢! 我自己会猜测,因为这个类是模板化的,枚举会以某种方式多次定义......
答案 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 );
}