2015-05-17 69 views
2

我试图写一个C++ 11链表的实现,用链表是一个模板类和它的节点是一个嵌套类,如下所示:类模板声明C++嵌套类

template <typename T> 
class LinkedList { 
public: 
    class Node; 
    std::shared_ptr<Node> listSearch(const T &input) const; 

private: 
    std::shared_ptr<Node> head; 
    std::shared_ptr<Node> tail; 
}; 

template <typename T> 
class LinkedList<T>::Node { 
private: 
    T data; 
    std::shared_ptr<Node> next; 
} 

我假设类Node本身不是一个模板,但是当LinkedList被实例化时,它也会创建Node类。

当我尝试按以下方式定义listSearch函数时,出现错误:“模板类型参数的模板参数必须是类型;您是否忘记了'typename'?”。有人可以解释什么是错的?

template <typename T> 
std::shared_ptr<LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) { ... } 

编辑:

好了,我重新编译gcc和错误信息是清晰的。它需要以下内容:

std::shared_ptr<typename LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) const { ... } 

为什么在LinkedList :: Node之前需要typename?这不是一个明显的类型?

+0

忘了'模板'? –

+0

对不起,我的错。模板存在,只是忘了添加它的问题。编辑OP。 – JamesLens

+0

我在我的答案中放了一个链接。 –

回答

3

here

template <typename T> 
std::shared_ptr<typename LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) { ... } 
+0

啊C++你很复杂。谢谢,这回答了我的问题。 – JamesLens

+0

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-types另一个有兴趣的人的答案。 – JamesLens