【问题标题】:Need typename error (template related error)需要类型名错误(模板相关错误)
【发布时间】:2023-04-02 02:35:02
【问题描述】:

我在另一个模板化的类中有一个名为 node 的类。 Node 类的一些方法返回 Node 指针。这是我如何实现的摘录

 template <typename T>
 class myClass{
 ....
     class Node{
         Node* getNodePointer();
         ...
     }
 }     
 ... 
 template <typename T>
 myClass<T>::Node* myClass<T>::Node::getNext()  
 { return next;  }

当我编译上面的代码时,我得到这个错误“myClass.h:138:1: error: need ‘typename’ before ‘myClass::Node’ 因为 ‘myClass’ 是一个依赖范围”。我该如何解决这个问题?非常感谢

【问题讨论】:

  • typename myClass&lt;T&gt;::Node* myClass&lt;T&gt;::Node::getNext()。请注意开头的typename
  • This 处理为什么
  • @GuyGreer THX 对于低垂的果实 ;) ...

标签: c++ templates


【解决方案1】:

为了澄清,编译器不知道myClass&lt;T&gt;::Node 现在或将来会是一个类型。这样想:

template <typename T>
class A
{
public:
    typedef T value_type;
};

template <typename T>
class B
{
public:
   typename A<T>::value_type x;
};

template <> A<int> { public: static int value_type=10;}

你必须向编译器保证类型是类型名。它默认假设它是一个值。

【讨论】:

  • 谢谢解释!!
【解决方案2】:

我该如何解决这个问题?

编译器的错误信息非常清楚这一点:
要在模板类中使用嵌套的classes、structs 或typedefinitions,您需要添加typename 关键字来告诉编译器您要将其用作类型:

   template <typename T>
   typename myClass<T>::Node* myClass<T>::Node::getNext()  { // ...
// ^^^^^^^^ << Add typename keyword

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多