改述问题
我发现我原来的问题不够明确,而且回复者误解了我的问题。所以让我试着澄清一下:
假设我有两个班级:
struct C { void(*m_func)(C*); };
struct D { std::function<void(D*)> m_func; };
现在我想制作两者的通用版本,所以我做了这样的事情:
template<typename Func>
struct G
{
Func m_func;
};
但现在我不知道如何实例化这个类:
G<void(*)(G*)> c; //error
G<std::function<void(G*)>> d; //error
G<void(*)( G<void(*)(G<???>*)> *)> c; //???
G<std::function<void( G<std::function<void(G<???>*)>> *)>> d; //???
原始问题:
您好,
我有一个模板类,可以将函数指针或std :: function对象作为其参数。一切都很好,直到该函数在其签名中使用模板类的指针:
#include <functional>
template<typename Func>
class C
{
public:
C() {}
Func m_func;
};
void foo()
{
C<void(*)(C*)> c;
C<std::function<int(C*)>> d;
}
相关的编译器错误:
error C2955: 'C' : use of class template requires template argument list
error C3203: 'function' : unspecialized class template can't be used as a template argument for template parameter 'Func', expected a real type
error C2955: 'std::tr1::function' : use of class template requires template argument list
如何解决这个问题?
答案 0 :(得分:2)
C
是一个类模板,而不是一个类。您不能拥有C
类型的对象或指向C
的指针;您只能拥有C
实例化对象,例如C<int>
或C<float>
。
答案 1 :(得分:2)
在这一行:
C<void(*)(C *)> c;
粗体 C (强调添加)未指定模板参数。您应该通过在&lt;&gt;中指定类型来指定此函数指针所用的C*
类型。括号中。
答案 2 :(得分:2)
您不能将递归模板命名为本身,但您可以将其命名为 in ,因为参数列表在自引用中是可选的。
然后问题就是告诉模板如何将自己传递给“某事”。
template< typename T >
struct fptr_taking_type { // this template is essentially a function
typedef void (*type)( T ); // from types to types, the result being
}; // the typedef
template< typename T >
struct stdfn_taking_type {
typedef function< void (*)( T ) > type;
};
template< template< typename > class F >
struct G {
typename F< G * >::type m_func; // this declares the member variable
};
...
G< fptr_taking_type > q;
答案 3 :(得分:1)
这有帮助吗?
void foo1(){}
template<typename Func>
class C
{
public:
C(Func f) : m_func(f) {}
Func m_func;
C<Func> *mp; // it is a pointer,
};
void foo()
{
C<void (*)(void)> c (foo);
}
int main(){
C<void (*)(void)> c(foo);
}
答案 4 :(得分:0)
您不能拥有递归模板。