我得到一个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]
这是什么意思以及如何摆脱警告?
答案 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
声明一样,从而确保该类具有外部链接。