模板类中的成员函数指针会出现错误:在“::”后必须是类或命名空间。

6
我正在尝试在C++中声明一个模板函数指针。
template <class T>
class MyClass
{
public:
    typedef const unsigned char* (T::*MyTemplatedEvent)(unsigned long &myParameter);
};

但是由于某些原因,我一直收到这个错误:

'T':在'::'之后必须是一个类或命名空间

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


我认为你需要在 T:: 前面加上 typename。让我检查一下。 - chris
1
此外,成员函数指针不好用。只需使用 std::function,您就不会遇到这个问题。 - Puppy
编译正常(http://ideone.com/fF95q),你使用哪个编译器? - iammilind
@iammilind:尝试创建"MyClass<A*> m"或"MyClass<int>。:)" - Idov
1
@mikhail:这是代码。只需尝试使用“int”作为模板创建此类的实例即可 :) - Idov
显示剩余2条评论
5个回答

2
使用T::* MyTemplatedEvent ,您期望T是一个类类型,因为只有类类型才能有成员指针。这意味着,如果您传递非类类型(例如 int char * ),则会出现指定的错误,因为这些类型没有成员,反之亦然。

编译器应该知道T是一个类。这在MyClass声明中说明了...

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

1
我猜测这是因为我试图创建一个模板的"MyClass",它是一个指针或原始类型,编译器知道它们不能有与之关联的函数指针...

抱歉,这不是一个答案。我也遇到了同样的问题,并正在寻找真正的解决方案——这就是为什么我添加了悬赏。 - Theo
1
@Theo:不,这就是答案。OP在评论中澄清他尝试了MyClass<int>MyClass<SomeType*>。这些原始类型根据定义不是类类型。如果您遇到此错误但没有类似的代码,则可以将其作为独立问题发布。 - Xeo
@Xeo:请添加一个单独的回复,这样我就可以给你奖励了——你的答案是最有帮助的。 - Theo
@Theo:我不知道我应该在那个答案里写什么,我只是总结了原帖的评论和答案。 :/ - Xeo
1
@Theo:嗯,如果有人给我推销声望,我不会拒绝的。;) - Xeo
显示剩余2条评论

0

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

template< class T > class MyClass

并且

template< typename T > class MyClass

这两个关键字是等效的,使用其中一个关键字并不会为编译器提供更多信息。

除此之外,我认为编译器是正确的,MyClass< int > 不起作用,因为在 C++ 中你不能写 int::something,而 MyClass< std::string > 将完美地工作。


如果谁对此进行了负面评价,并能以某种方式详细说明原因,我会非常感兴趣。谢谢。 - Seg Fault
你的逻辑是错误的。在模板中将 T 替换为 int 不是词法替换。你可以在模板中使用 p->~T() 伪析构语法,然后用 T==long long 实例化它,即使你不能在该模板之外写 p->~long long() - MSalters
即使在您所说的情况下,这个析构函数语法甚至对于int类型也是“伪造的”,但在模板实例化时,我们正在谈论一个成员函数指针,这就太多了。 - Seg Fault

-1

我认为你无法在C++中拥有一个模板函数指针,你可以查看这个链接 C++, function pointer to the template function pointer

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


是的,你可以有一个模板函数指针,你发的链接涉及了一个略微不同的问题。 - Sdra
Sdra,你能帮我写一个模板函数指针的工作代码片段吗?我不确定该怎么写。 - D Untouchable
@D Untouchable: 是的😉 只要把你的代码发布在我可以查看的地方,然后告诉我! - Sdra
@Sdra,我的意思是你能否发布一个模板函数指针的工作代码?函数指针声明例如-> void (*abc)(int)=NULL,可能的模板函数指针为template <class T> void (*abc) (T)=NULL; - D Untouchable
@D Untouchable:顺便说一下,这个话题是关于通用(模板)类的成员函数。而您所问的是具有通用(模板)参数的函数。以下是您所询问的例子……不幸的是,我不知道它是否会被正确格式化:#include <iostream>template <class T> void test( void (*handler)( T arg ), T argument ) { (*handler)( argument ); }template <class T> void handlerImpl( T arg ) { std::cout << "handlerImpl " << arg << std::endl; }int main() { test( handlerImpl, 10 ); test( handlerImpl, "Hello" ); return 0; } - Sdra

-1
尝试做以下事情:
typedef T type;
typedef const unsigned char* (type::*MyTemplatedEvent)(unsigned long &myParameter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接