模板和嵌套类/结构

时间:2009-11-07 19:02:25

标签: c++ templates data-structures containers

我有一个简单的容器:

template <class nodeType> list {
    public:
        struct node {
            nodeType info;
            node* next;
        };

    //...
};

现在,有一个名为_search的函数,它搜索列表并返回对匹配的节点的引用。现在,当我指的是函数的返回类型时,我认为它应该是list<nodeType>::node*。这是正确的吗?当我将函数定义为内联函数时,它可以完美地运行:

template <class nodeType> list {
    public:
        struct node {
            nodeType info;
            node* next;
        };

        node* _search {
            node* temp;
            // search for the node
            return temp;
        }
};

但是,如果我在课外定义函数,

template <class nodeType> list<nodeType>::node* list<nodeType>::_search() {
    //function
}

它不起作用。编译器发出错误Expected constructor before list<nodeType>::_search或其他内容。错误与此类似。我目前没有可以测试它的机器。

真心感谢任何帮助。

2 个答案:

答案 0 :(得分:24)

那是因为node是一种依赖类型。您需要按如下方式编写签名(请注意,为了清楚起见,我已将其分为2行)

template <class nodeType> 
typename list<nodeType>::node* list<nodeType>::_search() 
{
    //function
}

请注意使用typename关键字。

答案 1 :(得分:8)

您需要告诉编译器node是使用关键字typename的类型。否则,它会将节点视为static中的class list变量。每当在节点实现中使用节点作为类型时,添加typename