【问题标题】:Member to function pointer inside template class gives error: must be a class or namespace when followed by '::'模板类中的成员函数指针给出错误:后跟'::'时必须是类或命名空间
【发布时间】:2012-06-07 10:48:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我认为在T:: 之前需要一个typename。让我检查一下。
  • 此外,成员函数指针不好。只需使用std::function 就不会出现问题。
  • Compiles fine,你用的是哪个编译器?
  • 那么可能是编译器错误。您可能需要向 Microsoft 团队报告。
  • @mikhail:这是代码。只需尝试使用“int”作为模板创建此类的实例,就是这样:)

标签: c++ templates compiler-errors


【解决方案1】:

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

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

错了。 class T 与模板参数中的typename T 相同,只是告诉编译器T 是稍后作为模板参数传递的any 类型的占位符。它确实将类型限制为类类型。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对不起,这是一个非回答。我面临同样的问题并正在寻找一个真正的解决方案——这就是我添加赏金的原因。
    • @Theo:不,这就是答案,OP 在评论中澄清说他尝试了MyClass&lt;int&gt;MyClass&lt;SomeType*&gt;。根据定义,这些原始类型不是类类型。如果您收到此错误但没有类似的代码,您可能希望将其作为独立问题发布。
    • @Xeo:感谢您的澄清......我想这不是我当时面临的问题,因为我将一个类作为模板参数传递。将发布一个单独的问题。
    • @Xeo:请添加一个单独的回复,这样我就可以给你赏金——你的回答是最有帮助的。
    • @Theo:好吧,如果它被推到我身上,我不会拒绝代表。 ;)
    【解决方案3】:

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

    template< class T > class MyClass
    

    template< typename T > class MyClass
    

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

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

    【讨论】:

    • 如果谁反对这个可以以某种方式详细说明原因,我会非常感兴趣。谢谢。
    • (不是我的反对票)你的逻辑是错误的。在模板中将T 替换为int 不是词法替换。您可以在模板中使用p-&gt;~T() 伪析构函数语法,然后使用T==long long 实例化它,即使您不能在该模板之外编写p-&gt;~long long()
    • 这种析构函数语法是“伪造的”,即使对于您所说的上下文中的 int,但这里我们谈论的是模板实例化时的成员函数指针,这太过分了。
    【解决方案4】:

    尝试执行以下操作:

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

    【讨论】:

      【解决方案5】:

      我不认为你可以在 C++ 中使用模板函数指针,你可以查看这个链接 C++, function pointer to the template function pointer

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

      【讨论】:

      • 是的,你可以有一个模板函数指针,你发布的链接涉及一个稍微不同的问题
      • Sdra,你能帮我提供一个模板函数指针的工作代码 sn-p 吗?我不知道怎么写。
      • @D Untouchable: 是的 ;) 只需将您的代码发布到我可以查看的地方并告诉我!
      • @Sdra 我的意思是你能发布一个模板函数指针的工作代码吗?函数指针声明 例如-> void (*abc)(int)=NULL 可能的模板函数指针 template &lt;class T&gt; void (*abc) (T)=NULL;
      • @D Untouchable:顺便说一句,这个主题是关于泛型(模板)类的成员函数。相反,您要问的是具有通用(模板)参数的函数。这是您要问的一个示例...不幸的是,我不知道它的格式是否正确:#include template void test( void (*handler)( T arg ), T argument ) { (*handler)( 参数 ); } 模板 void handlerImpl( T arg ) { std::cout
      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2019-06-20
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多