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


2:

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);


链接,因为,当然,在第二种情况下,您尚未定义模板函数。定义好之后,您实际上将拥有与第一个示例相同的程序。

关于c++ - 如何获得指向模板类中定义的好友函数的函数指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57546526/

10-11 23:16
查看更多