在'..'之前需要'typename',因为'..'是一个依赖范围

时间:2016-10-07 04:11:48

标签: c++

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

在.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 {

然后我添加了typename然后它给了我这个错误:

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> 
                 ^

我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

然而,这里是如何以实际的方式完成这门课程,没有像你遇到的那样的问题:

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

表示有时可以在不知道具体细节的情况下解决问题。