如何修复-Wsubobject-linkage警告?

时间:2016-12-15 14:54:25

标签: c++ c++11

我得到一个gcc警告代码,它在clang和VC ++中编译精细和免费警告,所以我认为它具有特定的gcc。这是代码:

namespace myns {
  using TokenList = std::vector<size_t>;
  using RuleList = std::vector<size_t>;
  using RulePathPair = std::pair<size_t, TokenList>;
  using CandidatesCollection = struct { std::map<size_t, TokenList> tokens; std::set<RulePathPair> rules; };

  class A {
  private:
    CandidatesCollection _candidates;
  };
} // namespace myns

并且警告是:

  

警告:&#39; myns :: A&#39;有一个字段&#39; myns :: A :: _ candidate&#39;其类型没有链接[-Wsubobject-linkage]

这是什么意思以及如何摆脱警告?

1 个答案:

答案 0 :(得分:1)

我认为编译器在这里可能是错误的:CandidatesCollection引用的类型实际上应该具有外部链接。

  

[basic.link] / 4 ...如果名称为      

...

     

(4.3) - 一个命名类(第9条),或在typedef声明中定义的未命名类,其中类具有typedef名称以用于链接目的(7.1.3); ...

           

[dcl.typedef] / 9 如果typedef声明定义了未命名的类(或枚举),则声明声明的第一个 typedef-name 该类类型(或枚举类型)用于表示类型(或枚举类型)仅用于链接目的(3.5)。 [示例:

 typedef struct { } *ps, S; // S is the class name for linkage purposes
     

- 示例]

因此,如果CandidatesCollection被定义为

typedef struct { ... } CandidatesCollection;

这两个段落清楚地表明CandidatesCollection命名的类很乐意拥有外部链接。

然后就是

  

[dcl.typedef] / 2 alde-name 也可以通过 alias-declaration 引入。 using关键字后面的标识符变为 typedef-name ,并且可选的 attribute-specifier-seq 跟随 typedef-name <的标识符/ em>的。它具有相同的语义,好像它是由typedef说明符引入的。

强调我的。这表明using引入的名称应该给出未命名的类&#34;用于链接目的的名称&#34;与同等的typedef声明一样,从而确保该类具有外部链接。