C++ 编译问题错误 - C2332:<class: missing tag name>

C++ compilation issue error - C2332: <class: missing tag name>

VS 2005 -> 编译无任何错误。

VS 2010 -> 编译有任何错误。

例如代码片段

template< bool f > struct static_assert;
template<>         struct static_assert<true> { static_assert() {} };

编译器错误:

error C2332: 'struct': missing tag name

例如代码片段

template< typename T >
class abcd
{
    struct xyz
    {
        xyz();
        char    c;
        T       tt;
    };
public:
    enum { value = sizeof(xyz)-sizeof(T) < sizeof(T) ? sizeof(xyz)-sizeof(T) : sizeof(T) };
};

编译器错误:

error C2332: 'class': missing tag name

任何建议。

在你的第一个代码片段中,问题是 static_assert 变成了 C++11 标准中的 reserved keyword (VS-2010 似乎正在使用它),而它是 'allowed' 以前版本语言中的标识符(例如 VS-2005 编译器使用的)。要解决此问题,请更改您的结构名称,即使这意味着只是更改一两个字母的大小写:

template< bool f > struct Static_Assert; // C++ is case-sensitive, so this is OK!
template<>         struct Static_Assert<true> { Static_Assert() { } };

我无法在您的第二个代码片段(使用 VS-2010)中重现该问题。