类模板中的友元成员函数定义

时间:2015-10-06 12:55:48

标签: c++ templates friend

无论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)期望的行为?

1 个答案:

答案 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的静态全局(命名空间范围)函数。 正如你在这里看到的,你正在做两次。