C 嵌套模板返回类型

C++ nested templates return type

本文关键字:返回类型 嵌套      更新时间:2023-10-16

我正在尝试从其模板容器类返回嵌套的模板对象

template <typename T>
class A {
    template <typename S>
    struct node {
        S value;
        struct node<S>* right;
        ....
    };
    private:
        ....
        node<T>* foo();
}

我有

template <typename T>
A<T>::node<T>* A<T>::foo() {
....
}

这是Visual Studio的错误

1>  A.cpp
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(576): warning C4346: 'A<T>::?$node@$RT@BAAB@' : dependent name is not a type
1>          prefix with 'typename' to indicate a type
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(576): error C2143: syntax error : missing ';' before '*'
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(576): error C2065: 'T' : undeclared identifier
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(576): error C2923: 'A' : 'T' is not a valid template type argument for parameter 'T'
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(576): error C2923: 'A<T>::node' : 'T' is not a valid template type argument for parameter 'S'
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(613): error C2509: 'foo' : member function not declared in 'A'
1>          c:usersuserdropboxvisual studio projectsfooProjfooProjA.h(11) : see declaration of 'A'
1>c:usersuserdropboxvisual studio projectsfooProjfooProjA.cpp(613): fatal error C1903: unable to recover from previous error(s); stopping compilation

我错过了太明显的东西吗?

编辑:

 a.h
#ifndef TEMP_H
#define TEMP_H
template <typename T>
class A {
    template <typename S>
    struct node
    {
        S value;
        struct node* right;
        struct node* left;
    };

private:
    node<T>* removeWithTwoChildren();
};
template <typename T>
A<T>::template node<T>* A<T>::removeWithTwoChildren() {
    A<T> temp = new A<T>;
    return temp;
}
#endif

它不需要是一个结构,我也可以使用类。

我正在使用VC 2013。

我有问题的地方是在返回类型声明中

A<T>::template node<T>*

我想返回

node<T>*

好。我正在肢体踩踏,暗示这是您可能需要的:

template<typename T>
typename A<T>::template node<T>* A<T>::foo()
{
    // your stuff goes here   
}

如果您想知道那是从哪里来的,请看到此答案。约翰内斯(Johannes)是C 和模板领域中的绝对机器,坦率地说,忘记了对这种语言的了解比大多数人都知道知道 。阅读该帖子。您遇到的问题来自依赖的名称分辨率。您需要"告诉"编译器要遵循的事情也是一个模板。