我如何获得指向模板中定义的友元函数的函数指针 class
How do i get a function pointer to a friend function defined inside a template class
我想定义一个模板 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) {}
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);
链接,因为,当然,在你的第二种情况下,你还没有定义模板函数。一旦它被定义,您实际上就拥有了与您的第一个示例相同的程序。
我想定义一个模板 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) {}
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);
链接,因为,当然,在你的第二种情况下,你还没有定义模板函数。一旦它被定义,您实际上就拥有了与您的第一个示例相同的程序。