类模板中的友元成员函数定义
Friend member function definition in class templates
无论c++标准有什么要求(98,11,14),下面这段代码都不能在c++和clang++中正确编译:
$ 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++都不会错,所以我希望它在某个地方被记录/暗示。
第二,这种行为的意义是什么?在类内部定义友元是有价值的(例如,请参阅在类内部或外部定义友元函数有什么区别),那么保持这种行为的价值是什么呢?我的意思是,标准不应该像人们(我)期望的那样接受这种行为吗?
为每个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
的静态全局(命名空间范围)函数。正如你在这里看到的,你做了两次
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法