【问题标题】:How to return a pointer to template struct?如何返回指向模板结构的指针?
【发布时间】:2018-12-12 13:43:52
【问题描述】:
#include <iostream>
using namespace std;


template<class T>
class LinkedList
{
public:
    struct Node {
        T data;
        Node* link;
    };
    struct Node* getNode();
    LinkedList();
    ~LinkedList();
private:
    Node* head;
};

template<class T>
struct Node* LinkedList<T>::getNode() // Error
{
    return head;
}

template<class T>
LinkedList<T>::LinkedList()
{
    head = NULL;
}

template<class T>
LinkedList<T>::~LinkedList()
{
}

如您所见,我想创建一个可以采用任何数据类型的 LinkedList 类。我在返回指向模板结构的指针时遇到问题。

错误信息是declaration is incompatible with...(函数声明)

【问题讨论】:

  • 如果不是模板也会遇到同样的问题。

标签: c++ templates pointers struct


【解决方案1】:

在

template<class T>
struct Node* LinkedList<T>::getNode() // Error
{
    return head;
}

Node 的范围为LinkedList&lt;T&gt;。因为你不在函数参数列表或者函数体里面,所以不合格的Node,是不能供你使用的。您必须使用LinkedList&lt;T&gt;::Node 来确定名称的范围,以告诉编译器您正在使用LinkedList&lt;T&gt; 的Node。这样做时还需要使用关键字typename,因为Node 是从属名称。这意味着您需要:

template<class T>
typename LinkedList<T>::Node* LinkedList<T>::getNode()
{
    return head;
}

或者您可以使用尾随返回类型并使用

template<class T>
auto LinkedList<T>::getNode() -> Node*
{
    return head;
}

省去打字的时间。


另请注意,当您使用struct 的名称时,您不需要使用struct。这在 C 中是必需的,但在 C++ 中不是必需的。

【讨论】:

  • 或者,它可能是一个尾随返回类型:LinkedList&lt;T&gt;::getNode() -&gt; Node*
  • @JDoe 把struct Node* getNode(); 改成Node* getNode(); 还能得到吗?
  • @MaxLanghof 是的。我忘了它依赖于T。
  • 非常感谢大家^^
  • @eerorika 好主意。我已将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2010-12-01
相关资源
最近更新 更多