【问题标题】:need ‘typename’ before ‘..’ because ‘..’ is a dependent scope [duplicate]在'..'之前需要'typename',因为'..'是一个依赖范围[重复]
【发布时间】:2017-02-15 23:34:09
【问题描述】:

在尝试编译模板类时遇到问题。

在.h文件中

template <typename dataType>
class Node {    
 private:
    dataType nodeData;
    Node<dataType>* nextLink;
    Node<dataType>* previousLink;
 public:    
    Node(const dataType& nodeData);

   // methods

在.template文件中

template <typename dataType>
Node<dataType>::dataType Node<dataType>::getData() const {
    return nodeData;
};

我在尝试编译时遇到的错误是:

 need ‘typename’ before ‘Node<dataType>::dataType’ because ‘Node<dataType>’ is a dependent scope

 Node<dataType>::dataType Node<dataType>::getData() const {

然后我添加类型名,然后它给了我这个错误:

error: expected nested-name-specifier before ‘dataType’
       typename dataType getData() const;
                ^
error: expected ‘;’ at end of member declaration
error: declaration of ‘int Node<dataType>::dataType’
error: shadows template parm ‘class dataType’
       template <typename dataType> 
                 ^

我做错了什么?

【问题讨论】:

  • 看起来您将typename 放在dataType 之前,而不是在Node&lt;dataType&gt;::dataType 之前,如编译器所示。是这样吗?代码修改后能显示源码吗?
  • 消息说将typename放在‘Node&lt;dataType&gt;::dataType之前。不早于dataType
  • @BrianCain 不要认为它与那个重复
  • 看起来您已将typename 放在类的声明中,而不是实现中。作为缺乏可重复的例子投票结束。
  • 也就是说,对于 Node,具有 getter 成员函数的访问控制不会在此级别为您购买任何东西。没有优势,但冗长和复杂。我只是删除它,使用简单的struct

标签: c++


【解决方案1】:

没有名为dataType的成员,我假设返回类型应该只是模板dataType

template <typename dataType>
dataType Node<dataType>::getData() const {
    return nodeData;
}

在这种情况下,编译器消息具有误导性,因为它没有找到正确的定义,它假定 dataType 指的是模板参数。

【讨论】:

    【解决方案2】:
    template <typename DataType>
    class Node {
    public:
        using dataType = DataType;
    private:
        dataType nodeData;
        Node<dataType>* nextLink;
        Node<dataType>* previousLink;
    public:    
        Node(const dataType& nodeData);
        dataType getData() const;
    };
    template <typename DataType>
    typename Node<DataType>::dataType Node<DataType>::getData() const {
        return nodeData;
    };
    

    像这样指定typename

    http://melpon.org/wandbox/permlink/Agu2s6vw6OLfbbRh

    【讨论】:

      【解决方案3】:

      提供的示例代码不完整,因此必须猜测具体问题。

      但是,以下是如何以实用的方式完成该课程,而不会遇到您遇到的问题:

      template< class Item >
      struct Node
      {
          Node* next;
          Node* prev;
          Item item;
      };
      

      表明有时可以在不知道确切细节的情况下解决问题。

      【讨论】:

        猜你喜欢
        • 2014-05-17
        • 1970-01-01
        • 2020-09-11
        • 2011-01-21
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 2019-01-18
        相关资源
        最近更新 更多