无论C ++标准是什么(98,11,14),以下代码都无法使用G ++和Clang ++进行正确编译:
def self.symbiont_enabled?
@@symbiont_enabled
end
例如:
$ cat foo.cc
template <typename T>
struct foo
{
friend void bar(){}
};
int main()
{
foo<int> fi;
foo<char> fc;
}
我知道我可以通过将$ clang++-mp-3.7 -std=c++14 foo.cc
foo.cc:4:15: error: redefinition of 'bar'
friend void bar(){}
^
foo.cc:10:13: note: in instantiation of template class 'foo<char>' requested here
foo<char> fc;
^
foo.cc:4:15: note: previous definition is here
friend void bar(){}
^
1 error generated.
中的bar
的定义(而非声明)排除在foo
之外来避免此问题,我不是要求解决方法。相反,我想了解发生了什么。所以我有两个问题:
首先,我没有看到标准中的哪个行为被记录或暗示。我怀疑G ++和Clang ++都会出错,所以我预计它会被记录/隐含在某处。
其次,这种行为有什么意义?在类中定义朋友是有价值的(参见例如Is there any difference if we define friend function inside or outside of class),那么保持这种行为的价值是什么。我的意思是,标准是否应该接受(I)期望的行为?
答案 0 :(得分:3)
为每个T
创建一个新类。因此foo<int>
是一个类,foo<char>
是另一个类。
如果您举例并展开它,它将如下所示:
struct foo_int
{
friend void bar() {}
};
struct foo_char
{
friend void bar() {}
};
int main()
{
foo_int fi;
foo_char fc;
}
通过friend
关键字,您将定义名为bar
的静态全局(命名空间范围)函数。
正如你在这里看到的,你正在做两次。