我正在尝试在C ++中声明一个模板函数指针。
template <class T>
class MyClass
{
public:
typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);
};
但由于某种原因,我不断收到此错误:
'T':当后跟'::'
时必须是类或命名空间
有人能说出我做错了什么吗? 编译器应该知道T是一个类。它在MyClass声明之上如此说明......
答案 0 :(得分:2)
使用T::*MyTemplatedEvent
,您期望T
成为类类型,因为只有类类型可以有成员指针。这意味着如果你传递一个非类类型,比如说int
或char*
,你会得到指示的错误,因为没有成员,相反没有这些类型的成员指针。
编译器应该知道T是一个类。它在MyClass声明之上如此说明......
错误。 class T
与模板参数中的typename T
相同,并且只告诉编译器T
是任何类型的占位符,该类型作为模板参数传递稍后的。 不将类型限制为类类型。
答案 1 :(得分:1)
我猜这是因为我试图创建模板的“MyClass”,这是一个编译器知道不能拥有的指针或原语以及与它们相关的函数指针......
答案 2 :(得分:0)
首先请注意,在MyClass的定义中,两种方式将类声明为
template< class T > class MyClass
和
template< typename T > class MyClass
是等价的,你不是通过使用一个关键字来为编译器提供更多信息。
除此之外,我说编译器是正确的,MyClass&lt; int&gt;因为你不能在C ++中编写int :: something,而不是在例如MyClass&lt; std :: string&gt;会很好地运作。
答案 3 :(得分:-1)
尝试执行以下操作:
typedef T type;
typedef const unsigned char* (type::*MyTemplatedEvent)(unsigned long &myParameter);
答案 4 :(得分:-1)
我不认为你可以在C ++中有一个模板函数指针,你可以查看这个链接 C++, function pointer to the template function pointer
“typedef const unsigned char *(T :: * MyTemplatedEvent)(unsigned long&amp; myParameter);”这里的T是模板参数而不是任何名称空间或类类型,T是数据类型可以是用户定义的,也可以是基本数据类型,如int或char,但它不是命名空间或类,这就是为什么你得到编译错误,这是正确的。