gpt4 book ai didi

c++ - 我如何获得指向模板类中定义的友元函数的函数指针

转载 作者:行者123 更新时间:2023-11-28 04:11:55 25 4
gpt4 key购买 nike

我想定义一个模板类Foo<T>和一个模板函数 func<T> ,所以 func<T>Foo<T>的 friend ,但是 func<T1>不是 Foo<T2> 的 friend 对于 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>)
{
}

作为 friend 。

这与模板函数不同。如果你想引用模板函数,那么你可以这样做:

template < typename T >
class Foo {
friend void func<>(Foo);
};

就像您的第一个示例一样。现在,既不

func(a);

也不

(&func)(a);

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

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

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