【问题标题】:Elaborated type refers to a typedef error on Clang详细类型是指 Clang 上的 typedef 错误
【发布时间】:2014-08-25 17:58:07
【问题描述】:

使用此编译器 Apple LLVM 5.1 (clang-503.0.40) 时出现以下错误

代码在这里

测试.h

  class media
  {
  public:
     typedef enum
     {
       audio,
       video,
       text,
       data
     }mediatype;
  };

test.cpp

 #include "test.h"

 int main()
 {
   enum media::mediatype medias[] = {media::audio, media::video};
   for (int i=0; (i < sizeof(medias) / sizeof(enum media::mediatype)); ++i)
   {


   }
 }

test.cpp:5:15: 错误:详细类型指的是 typedef 枚举 media::mediatype medias[] = {media::audio, media::video};

test.cpp:6:58: 错误:对“媒体类型”的引用不明确 for (int i=0; (i

如果我删除 enum 关键字如下代码编译

  #include "test.h"

  int main()
  {
   media::mediatype medias[] = {media::audio, media::video};
   for (int i=0; (i < sizeof(medias) / sizeof(media::mediatype)); ++i)
   {


   }
 }

有人能说说为什么clang会抱怨吗

谢谢

【问题讨论】:

  • 消息不是说到底出了什么问题吗?你到底为什么要首先定义枚举?!
  • mediatype 枚举不是您可以接受大小的成员。如果您想知道特定 enum 中有多少枚举,可以添加一个额外的枚举,其值是枚举的数量。
  • 该标头中该枚举的定义来自现有库,因此我没有对它进行类型定义
  • 您的编译器支持 C++11。当你可以做 for(auto&amp; m : medias) { } 时,绝对不需要旧的 sizeof 技巧

标签: c++ clang


【解决方案1】:

在 C++ 中,您不需要将 typedefenums 一起使用:当您编写 enum XYZ 时,编译器会创建一个类型 XYZ,因此您可以稍后编写 XYZ varOfTypeXYZ,而不是 enum XYZ varOfTypeXYZ .

如下重写media 将解决问题:

class media {
public:
     enum mediatype
     {
       audio,
       video,
       text,
       data
     };
};

Demo on ideone.

enum media::mediatype的问题是你的声明没有创建enum标签mediatype,它创建了一个名为mediatype的类型。您定义的enum 是匿名的,因此无法正确解析引用enum media::mediatype

因此,解决此问题的另一种方法是在enum 定义中添加标签,如下所示:

class media {
public:
     typedef enum mediatype
     {
       audio,
       video,
       text,
       data
     } mediatype;
};

Demo on ideone.

【讨论】:

    【解决方案2】:

    改为:

    class media {
    public:
      enum mediatype {audio, video, text, data};
    };
    
    
    int main()
     {
       media::mediatype medias[] = {media::audio, media::video};
       for (int i=0; (i < sizeof(medias) / sizeof(enum media::mediatype)); ++i) {
    
       }
     }
    

    你写的不是有效的 C++ 语法不是 Clang 的错。

    【讨论】:

      【解决方案3】:

      typedef 表示mediatype 是类型名,而不是枚举名;所以enum media::mediatype 不是引用它的有效方式。只能称为media::mediatype

      如果你把它改成更常用的成语:

      enum mediatype {...};
      

      那么它既是类型名称又是枚举名称,因此您可以将其称为enum media::mediatype,或者只是media::mediatype

      sizeof 表达式中,您还可以引用一个对象而不是类型名,这样更不容易出错,因为如果数组类型发生变化,您仍然会得到正确的答案:

      sizeof(medias) / sizeof(medias[0])
      

      更好的是,您可以使用辅助函数来提供数组的大小,这样更不容易出错,因为您不必复制数组名称,并且如果出现以下情况,它也不会给出错误的结果您不小心将其应用于指针而不是数组:

      template <typename T, size_t N>
      size_t array_size(T(&)[N]) {return N;}
      
      for (size_t i = 0; i < array_size(medias); ++i) {}
      

      或者,在 C++11 中,您根本不需要计算大小:

      for (media::mediatype media : medias) {}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 2012-09-11
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        相关资源
        最近更新 更多