6

我正在尝试在 C++ 中声明一个模板函数指针。

template <class T>
class MyClass
{
public:
    typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);
};

但由于某种原因,我不断收到此错误:

'T': 必须是类或命名空间,后跟 '::'

有人能告诉我我做错了什么吗?
编译器应该知道 T 是一个类。它在 MyClass 声明上方这么说...

4

5 回答 5

2

使用T::*MyTemplatedEvent,您期望T成为类类型,因为只有类类型可以具有成员指针。这意味着如果你传递一个非类类型,比如intor char*,你会得到指示的错误,因为没有成员,相反,这些类型也没有成员指针。

编译器应该知道 T 是一个类。它在 MyClass 声明上方这么说...

错误的。class T与模板参数中的相同typename T,并且仅告诉编译器这是稍后作为模板参数传递的任何T类型的占位符。它不类型限制为类类型。

于 2012-09-26T19:08:27.760 回答
1

我猜这是因为我尝试创建模板的“MyClass”,它是编译器知道不能拥有的指针或原语以及与它们关联的函数指针......

于 2012-06-02T15:22:37.130 回答
0

首先请注意,在 MyClass 的定义中,两种方式都将类声明为

template< class T > class MyClass

template< typename T > class MyClass

是等效的,您不会通过使用一个关键字而不是另一个关键字来为编译器提供更多信息。

除此之外,我想说编译器是对的, MyClass< int > 将无法工作,因为您不能在 C++ 中编写 int::something ,而例如 MyClass< std::string > 将工作得很好。

于 2012-09-23T14:53:13.263 回答
-1

尝试执行以下操作:

typedef T type;
typedef const unsigned char* (type::*MyTemplatedEvent)(unsigned long &myParameter);
于 2012-06-02T14:32:06.007 回答
-1

我不认为你可以在 C++ 中有一个模板函数指针,你可以检查这个链接 C++,函数指针指向模板函数指针

“typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);” 这里 T 是模板参数,不是任何命名空间或类类型,T 是一个数据类型,可以是用户定义的或基本数据类型,如 int 或 char,但它不是命名空间或类,所以这就是你得到编译错误的原因,这是正确的。

于 2012-09-24T09:25:16.587 回答