gpt4 book ai didi

c++ - 有没有办法避免模板友元声明的外部可见性?

转载 作者:行者123 更新时间:2023-11-30 01:53:48 25 4
gpt4 key购买 nike

看看下面的例子:

嗯:

class A {
protected:
template<class T>
friend void b();
};

b.h:

template<class T>
void b() {}

主.cxx:

#include "a.h"

int main()
{
b<double>();
}

请注意,我忘记在主文件中包含“b.h”。不幸的是,编译器选择了类 A 中的友元声明并编译了 main 函数而没有提示。我留下了一个神秘的链接错误,这是令人惊讶的,因为实例化应该发生在 main.cxx 中:

[joel@fedora-joel friend]$ g++ main.cxx 
/tmp/ccfpaeHw.o: In function `main':
main.cxx:(.text+0x5): undefined reference to `void b<double>()'
collect2: error: ld returned 1 exit status

我的问题是:为什么编译器允许这样做?有什么办法可以解决吗?

最佳答案

ISO/IEC 14882:2003,§11.4,第 3 段这样说:

A function first declared in a friend declaration has external linkage (3.5). Otherwise, the function retains its previous linkage (7.1.1).

因此,友元声明兼作函数声明。这允许 main 调用该函数,因此没有编译器错误。

发生链接器错误是因为声明没有匹配的函数定义。

我看不到避免这种行为的方法(因为标准规定了它)。这也是有道理的,因为无论如何都需要一个函数声明来使友元声明有效(否则你会有一个未声明函数的友元声明)。因此,如果友元声明不能兼作函数声明,则必须以其他方式提供函数声明(例如通过包含适当的 header )。

关于c++ - 有没有办法避免模板友元声明的外部可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22812945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com