如何获取指向模板类中定义的友元函数的函数指针
How do i get a function pointer to a friend function defined inside a template class
我想定义一个模板类Foo<T>
和一个模板函数func<T>
,这样func<T>
是Foo<T>
的朋友,但func<T1>
不是Foo<T2>
的朋友,T1 != T2
。据我所知,有两种方法可以做到这一点。
1:
template < typename T >
class Foo;
template < typename T >
void func(Foo<T> x);
template < typename T >
class Foo {
friend void func<>(Foo<T>);
};
template < typename T >
void func(Foo<T> x) {}
阿拉伯数字:
template < typename T >
class Foo;
template < typename T >
void func(Foo<T> x);
template < typename T >
class Foo {
friend void func(Foo) {}
};
在这两种情况下,我都可以这样称呼func
int main(void) {
Foo<int> a;
func(a);
但是当我尝试获取函数指针时
(&func)(a);
}
第二个版本失败并显示链接器错误:
/tmp/ccOICrUD.o: In function `main':
foo2.cpp:(.text+0x2c): undefined reference to `void func<int>(Foo<int>)'
collect2: error: ld returned 1 exit status
为什么?如何获取指向上面的 #2 中的函数的函数指针?
template < typename T >
void func(Foo<T> x);
这声明但确实定义了模板函数。
template < typename T >
class Foo {
friend void func(Foo) {}
};
这不会定义模板并使其成为朋友。这有效地定义了非模板函数
void func(foo<T>)
{
}
作为朋友。
这与模板函数不同。如果要引用模板函数,则可以执行以下操作:
template < typename T >
class Foo {
friend void func<>(Foo);
};
就像您的第一个示例一样。现在,两者都不是
func(a);
也不
(&func)(a);
链接,因为当然,在第二种情况下,您还没有定义模板函数。一旦定义了它,您实际上就拥有与第一个示例相同的程序。
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- Visual Studio中的函数声明和函数定义问题
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 具有enable_if外部类原型的模板类构造函数定义
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为函数定义符号不明确的指针参数
- C++模板专用化 - 无法匹配函数定义
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 找不到 #define 的函数定义
- 根据类型特征更改函数定义?
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 命名空间更改函数定义
- "Type&"与C++函数定义中的"Type*"
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 如何从 C++ 中的现有模板函数定义新函数
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 为什么c++允许成员函数定义中实例的私有成员访问
- Qt基类函数定义
- C++函数定义中参数列表后面额外一对括号的含义