如何获取指向模板类中定义的友元函数的函数指针

How do i get a function pointer to a friend function defined inside a template class

本文关键字:函数 定义 指针 友元 取指 何获      更新时间:2023-10-16

我想定义一个模板类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);

链接,因为当然,在第二种情况下,您还没有定义模板函数。一旦定义了它,您实际上就拥有与第一个示例相同的程序。