【问题标题】:C++ compilation issue error - C2332: <class: missing tag name>C++ 编译问题错误 - C2332: <class: missing tag name>
【发布时间】:2020-09-01 09:41:48
【问题描述】:

VS 2005 -> 编译没有任何错误。

VS 2010 -> 编译时出现任何错误。

例如代码sn-p

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

编译器错误:

错误 C2332:“结构”:缺少标签名称

例如代码sn-p

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) };
};

编译器错误:

错误 C2332:“类”:缺少标签名称

任何建议。

【问题讨论】:

  • 您需要发布实例化模板的代码。否则cannot duplicate。另外,为什么不直接使用 Visual Studio 2019 而不是使用十年前的 VS 2010?
  • @PaulMcKenzie 在 VS 2015 中尝试了代码,但同样的错误。

标签: c++ visual-studio-2010 templates visual-studio-2005


【解决方案1】:

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

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

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

【讨论】:

  • VS 2010 尝试使用 C++ 11。但是当涉及到 C++ 11 功能时,它在许多方面都被破坏了,因为我猜工程师正在使用草稿 C++11 进行编译器工作标准文件。遵循实际 C++ 11 标准的最早的 VS 版本是应用了最新更新的 VS 2015。
  • @PaulMcKenzie 公平评论。但是,VS-2010 C++ 编译器完全符合 C++11 以禁止使用 static_assert 作为标识符,这是我回答的重点(也是 OP 问题的原因)。
  • @AdrianMole 感谢您的解释,已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多