当类和函数具有单独的模板参数时,在类定义之外定义友元函数
Define friend function outside class definition when the class and function have separate template parameters
下面的代码编译得很好(只是一个最小的例子,实际代码有更多的原因(:
template<int A>
class Foo {
template<int B>
friend int bar(Foo<A> a, Foo<B> b) {
return A * B;
}
};
int main() {
return bar(Foo<0>(), Foo<1>());
}
但是,我想将声明与定义分开,并将函数定义放在类定义之外。我已经尝试像对待成员函数一样这样做:
template<int A> template<int B>
int bar(Foo<A> a, Foo<B> b) {
return A * B;
}
但这无法编译,因为它似乎不是有效的语法:
error: too many template-parameter-lists
但是,合并此定义中的两个模板参数列表 ( template<int A, int B>
( 会给出链接器错误:
undefined reference to `int bar<1>(Foo<0>, Foo<1>)'
这让我相信不同的模板参数列表会导致编译器/链接器将bar
的定义解释为与声明不同的函数。
所以我的问题是:当类和函数具有单独的模板参数时,如何在类定义之外定义友元函数?
我认为没有办法做到这一点。嗯,有,但不是一般的。您始终可以为每个A
显式编写重载:
template<int B>
int bar(Foo<0> a, Foo<B> b) {
return 0 + B;
}
基本上,原因是为每个实例化定义了不同的bar
重载Foo
。例如,对于Foo<0>
,您将获得
template<int B>
int bar(Foo<0>, Foo<B>);
对于 Foo
的每个实例化,您将获得一个新的bar
模板。所有这些bar
都是独立的,因为它们使用的模板参数存在于bar
本身之外(来自外部模板(。
您不能使用双template<>
语法,因为这意味着您有两个东西(类、函数等(是模板。这里的情况并非如此,因为您只有bar
作为模板。第一/第二template<>
没有其他东西.
你不能合并它们,因为正如你所看到的,你会得到一个不同的功能。如果您查看上面的实例化bar
以获取Foo<0>
,您可以看到这与以下内容不同:
template<int A, int B>
int bar(Foo<A>, Foo<B>);
实例化版本将始终是更好的匹配,因为它不必为第一个参数推断任何内容。
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- Visual Studio中的函数声明和函数定义问题
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 具有enable_if外部类原型的模板类构造函数定义
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为函数定义符号不明确的指针参数
- C++模板专用化 - 无法匹配函数定义
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 找不到 #define 的函数定义
- 根据类型特征更改函数定义?
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 命名空间更改函数定义
- "Type&"与C++函数定义中的"Type*"
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 如何从 C++ 中的现有模板函数定义新函数
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 为什么c++允许成员函数定义中实例的私有成员访问
- Qt基类函数定义
- C++函数定义中参数列表后面额外一对括号的含义