C++ 模板类内的函数指针成员出现错误:后跟';:,则必须是类或命名空间:';

C++ 模板类内的函数指针成员出现错误:后跟';:,则必须是类或命名空间:';,c++,templates,compiler-errors,C++,Templates,Compiler Errors,我试图在C++中声明模板函数指针。 template <class T> class MyClass { public: typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter); }; 模板 类MyClass { 公众: typedef const unsigned char*(T::*MyTemplatedEvent)(unsigned long&myParam

我试图在C++中声明模板函数指针。
template <class T>
class MyClass
{
public:
    typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);
};
模板
类MyClass
{
公众:
typedef const unsigned char*(T::*MyTemplatedEvent)(unsigned long&myParameter);
};
但出于某种原因,我不断地犯下这样的错误:

“T”:后跟“:”时必须是类或命名空间

有人能说出我做错了什么吗?

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

尝试执行以下操作:

typedef T type;
typedef const unsigned char* (type::*MyTemplatedEvent)(unsigned long &myParameter);

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

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

template< class T > class MyClass
templateclass MyClass

模板类MyClass
如果是等效的,那么通过使用一个关键字而不是另一个关键字,就不会向编译器提供更多信息


<> P> >我想编译器是正确的,MyClass < int >将不能工作,因为你不能写int::C++中的东西,而MyClass例如将完全正常工作。

< P>我认为C++中不能有模板函数指针,你可以检查这个链接。


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

对于
T::*MyTemplatedEvent
,您希望
T
是类类型,因为只有类类型可以有成员指针。这意味着,如果您传递一个非类类型,例如
int
char*
,您将得到指示的错误,因为这些类型没有成员,相反,也没有成员指针

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


class T
与模板参数中的
typename T
相同,只告诉编译器
T
是以后作为模板参数传递的任何类型的占位符。它没有将类型限制为类类型。

我认为在
T::
之前需要
typename
。让我检查一下。此外,成员函数指针不好。只要使用
std::function
就不会有问题了。您使用哪种编译器?那么可能是编译器错误。您可能需要向Microsoft团队报告。@mikhail:这是代码。只需尝试创建一个以“int”作为模板的此类实例即可:)抱歉,这不是答案。我面临着同样的问题,正在寻找一个真正的解决办法——这就是为什么我增加了一笔赏金。@Theo:不,这是答案,OP在一篇评论中澄清说,他试图
MyClass
MyClass
。根据定义,这些基本类型不是类类型。如果您遇到此错误,但没有类似的代码,您可能希望将其作为独立问题发布。@Xeo:谢谢您的澄清。。。我想这不是我当时面临的问题,因为我将传递一个类作为模板参数。将发布一个单独的问题。@Xeo:请添加一个单独的回答,这样我就可以给你赏金了--你的回答是最有帮助的。@Theo:好吧,如果它推到我身上,我不会对rep说不。。)如果谁否决了这一点,谁能以某种方式详细说明原因,我会非常感兴趣。谢谢。(不是我的反对票)你的逻辑是错误的。模板中用
int
替换
T
不是词汇替换。您可以在模板中使用
p->~T()
伪析构函数语法,然后使用
T==long
实例化它,即使您不能在该模板之外编写
p->~long()
。即使在您所说的上下文中,这个析构函数语法也是“伪造的”,但这里我们谈论的是模板实例化时的成员函数指针,这太多了。是的,你可以有一个模板函数指针,你发布的链接涉及一个稍微不同的问题。DRA,你能帮我提供一个模板函数指针的工作代码片段吗?我不知道怎么写。@D贱民:是的;)只要把你的代码贴到某个地方,我就可以看一下,然后告诉我@Sdra我的意思是你可以发布一个模板函数指针的工作代码吗?函数指针声明,例如->
void(*abc)(int)=NULL
可能的模板函数指针
模板void(*abc)(T)=NULL
@D Untouchable:顺便说一句,本主题是关于泛型(模板)类的成员函数。相反,您要求的是具有泛型(模板)参数的函数。下面是一个你所问问题的例子。。。不幸的是,我不知道它的格式是否正确:#include template void test(void(*handler)(t arg),t argument){(*handler)(argument);}template void handlerImpl(t arg){std::cout
template< typename T > class MyClass