我有一个名为hash
的模板类。我的模板类hash
需要三个非类型参数。 hash
类的定义如下:
template <typename array_type, typename ptr_to_hash, typename hash_type>
class hash
{
public:
//default constructor
hash();
/* Overloaded Constructors */
// instantiates a hash object and the pointer to the hash_function
hash(const int&, std::ifstream&, const char*, ptr_to_hash*);
/* Methods for Hash Class */
void insert_to_hash();
// some other stuff
};
正如您所看到的,我希望我的非类型参数ptr_to_hash
成为我的函数void insert_to_hash
的指针。上面重载的构造函数的实现如下:
template <typename array_type, typename ptr_to_hash, typename hash_type>
hash<array_type, ptr_to_hash, hash_type>::hash(const int& dim, std::ifstream& in, const char* file, ptr_to_hash* hash_ptr)
{
// do some stuff to allocate from file
// point function pointer to correct function
hash_ptr = &this->insert_to_hash();
}
现在我正在尝试创建一个指向我的哈希函数的指针。所以我首先创建一个void
函数指针,然后将其传递给我重载的构造函数:
int main()
{
// create void function pointer
void (*foo)();
//create hash obj. from data read in from argv[1]
hash< member<int>, void(*), member<int> > awesome( count_lines(in,file), in, file, foo);
}
在上面member<int>
是一个模板结构,count_lines()
只返回文件中数量行的整数值。当我尝试这样做时,我收到错误
no matching function for call to ‘hash<member<int>, void*, member<int> >::hash(int, std::ifstream&, const char*&, void (*&)())
当我查看上面的错误时,我似乎将foo
函数指针对象传递为*&
,这当然与我班级中的任何函数调用都不匹配。
这是我问题的症结所在。我不确定在使用模板时如何传递指向我void insert_to_hash()
类中的hash
的函数指针。我显然做错了。
答案 0 :(得分:2)
作为参考的foo
类型为void(&)()
,指针为void(*)()
。我将省略模板签名中的显式指针,并将其作为参数的一部分:
template <typename FPtr> void run(FPtr f) { f(); }
void foo() { /* ... */ }
// ...
run<void(*)()>(foo);
您也可以声明run(FRef * f) { f(); }
并说run<void(&)()>(foo)
,但我不会打扰。没有办法不在函数指针中有指针,所以你不妨将它吸收到参数类型本身。
答案 1 :(得分:1)
考虑使用lambda而不是函数指针。
hash< member<int>, void(*), member<int> > awesome( count_lines(in,file), in, file, [what ever you want to pass]{});
并且您的问题肯定是签名不匹配的问题,它明确指出您使用的函数的签名不是您声明的。
答案 2 :(得分:0)
您的代码存在一些问题。 首先,这一行
hash_ptr = &this->insert_to_hash();
试图使用&amp; RETURN的操作符从CALL到insert_hash()并将结果赋值给hash_ptr。
其次,如果你纠正了这个问题,你仍然试图将一个成员从一个对象实例分配给函数指针 - 你不能。如果您将insert_to_hash方法设为静态,则可以执行以下操作:
template <typename ptr_to_hash> class hash
{
public:
hash( ptr_to_hash hash_ptr )
{
hash_ptr = insert_to_hash;
}
static void insert_to_hash()
{
}
};
int main( int argc, char *argv )
{
void (*foo)();
hash< void(*)() > awesome( foo );
return 0;
}