gpt4 book ai didi

c++ - 外部模板类和非模板友元函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:56 24 4
gpt4 key购买 nike

我已经开始尝试使用 extern 模板,但我偶然发现了一个我找不到任何相关信息的问题。假设我有一个带有非模板友元函数的类模板(在类模板声明中定义)。我为该类声明了一些 extern 模板实例化,但是如何将友元函数也声明为 extern?

下面是一些示例代码:

// --- test.h ---

template <typename T>
class Foo {
private:
T value;
public:
friend void some_friend_function(Foo<T>& obj) {
obj.value -= T(42);
};

void some_member_function(T rhs) { value += rhs; };

};

extern template class Foo<int>;
//extern void some_friend_function(Foo<int>&); // I tried this also...


// --- test.cpp ---

#include "test.h"

template class Foo<int>;
//void some_friend_function(Foo<int>&); // ... with this.

当我编译上面的代码时(有或没有注释行),我只得到以下导出符号:

0000000000000000 W _ZN3FooIiE20some_member_functionEi

因此,非模板友元函数肯定不会与类模板的显式实例化一起被实例化(和extern)。这是正常的吗?至少,这就是 GCC 产生的结果(在 4.6.3 和 4.7.2 上测试过)。

有什么方法可以让友元函数标记为外部?我知道这不是一个大问题,因为我可以愉快地接受根据需要实例化的友元函数(即非外部函数),但我很想知道是否有办法做到这一点,如果没有的话, 是疏忽还是故意的?

编辑:明显的解决方法

我的问题具体是关于非模板友元函数,而不是关于寻找解决方法来避免这个问题,这是微不足道的。第一个明显的解决方法是:

template <typename T>
class Foo {
private:
T value;
public:
template <typename U>
friend void some_friend_function(Foo<U>& obj) {
obj.value -= T(42);
};
};

extern template class Foo<int>;
extern template void some_friend_function(Foo<int>&);

// --- in cpp file: ---

template class Foo<int>;
template void some_friend_function(Foo<int>&);

还有一个匹配的比较紧密但是比较麻烦的是这样的:

template <typename T> class Foo;  // forward-declare.

template <typename T>
void some_friend_function(Foo<T>&); // declaration.

template <typename T>
class Foo {
private:
T value;
public:
friend void some_friend_function<>(Foo<T>& obj); // befriend the T-specialization.
};

template <typename T>
void some_friend_function(Foo<T>& obj) { // definition.
obj.value -= T(42);
};

extern template class Foo<int>;
extern template void some_friend_function(Foo<int>&);

// --- in cpp file: ---

template class Foo<int>;
template void some_friend_function(Foo<int>&);

最佳答案

“外部模板类”的作用是声明一个显式实例可用。显式实例化声明的效果不适用于内联函数或模板特化(14.7.2 [temp.explicit] 第 10 段):

Except for inline functions and class template specializations, explicit instantiation declarations have the effect of suppressing the implicit instantiation of the entity to which they refer.

由于类定义中的 friend 函数定义必然是 inline 函数,因此它将保持 inline 函数独立于显式实例化模板的声明(而且,正如您正确指出的那样,它不是模板,也不遵循模板实例化规则)。

关于c++ - 外部模板类和非模板友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877931/

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