我无法编译一个类,它将函数指针作为成员变量。指针是将类的实例作为参数的函数。
像
template<class T, int N>
double (*f)(Vector<T,N> v);
我得到“错误:数据成员'f'不能是成员模板”编译器是gcc 4.2。
修改
在使用模板之前,我只是
double (*f)(Vector v);
这也有效
double (*f)(Vector<double,2> v)
但我希望有一个函数的函数指针,它将泛型Vector作为参数。
答案 0 :(得分:2)
使用会员typedef
:
template <typename T, int N>
class Vector
{
public:
/// type of function pointer
typedef double (*FuncPtr)( const Vector& );
};
// concrete type
typedef Vector<double,10> VecDouble10;
// actual function
double func( const VecDouble10>& );
// usage
VecDouble10::FuncPtr fp = func;
答案 1 :(得分:2)
如果你想要一个“模板指针”,你可以尝试一个函数对象。下面的示例将1.0
添加到包装的函数模板。
struct AcceptsVector {
template<typename T, int N>
double operator()(Vector<T,N> v) const { return 1.0 + real_f(v); }
};
AcceptsVector f;
与“真实”模板指针的区别在于,您无法重新调用“AcceptsVector”来调用另一个模板,就像使用普通函数指针一样。绑定在编译时硬编码。但是,您可以像函数指针一样传递f
,并且可以像模板一样使用任何f
调用Vector<T, N>
。
答案 2 :(得分:1)
这不是很有效的c ++,基本上你要找的是模板模板参数。
http://www.progdoc.de/papers/ttp/psi-ttp/psi-ttp.html 解释了所有关于他们的事情
通常情况下,如果你遇到这种情况,你想找到一个workaroumd,因为你的代码很快就会变得难以理解
答案 3 :(得分:0)
好吧,编译器在编译时不知道你将拥有多少f
(每个可能T
和N
一个?)。因此,编译器无法计算您的类的对象需要多少内存。这就是禁止这种结构的原因。
答案 4 :(得分:0)
你不能有一个模板指向函数,这是没有意义的。 但你能做的是
#include <vector>
template <typename T>
void foo(const std::vector<T>& v) {
// do something
}
void (*ptr_foo)(const std::vector<int>&) = &foo<int>;
(这里函数指针是一个模板化函数,哪个模板参数显式设置为int
)
答案 5 :(得分:0)
因为您的代码与以下内容一样有意义:
struct X
{
template < typename T >
std::vector<T> vect;
};
您正在尝试将成员变量设为模板。这不是一个有效的C ++构造,我严重怀疑它会是什么。
你如何做你真正想要的?我不确定,因为我不知道你到底想要完成什么以及为什么。