C++ 嵌套模板返回类型

标签 c++ class templates nested

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

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:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.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:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.cpp(576): error C2143: syntax error : missing ';' before '*'
1>c:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.cpp(576): error C2065: 'T' : undeclared identifier
1>c:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.cpp(576): error C2923: 'A' : 'T' is not a valid template type argument for parameter 'T'
1>c:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.cpp(576): error C2923: 'A<T>::node' : 'T' is not a valid template type argument for parameter 'S'
1>c:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.cpp(613): error C2509: 'foo' : member function not declared in 'A'
1>          c:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.h(11) : see declaration of 'A'
1>c:\users\user\dropbox\visual studio projects\fooProj\fooProj\A.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   
}

如果您想知道它来自哪里 see this answer 。 Johannes 绝对是 C++ 和模板领域的机器,坦率地说,他忘记的关于这门语言的知识比大多数人知道的还要多。阅读那篇文章。您遇到的问题来自依赖名称解析。您需要“告诉”编译器接下来的内容也是一个模板。

关于C++ 嵌套模板返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21445127/

相关文章:

c++ - 模板多重继承歧义符号错误

c++ - 有人在现实生活中使用模板元编程吗?

c++ - 使用运算符子类化模板类

c++ - 用指定的字符结尾输入流,例如 '|'吗?

c++ - 模板函数中的通用模板参数

java - 如何向标准java类添加方法

python - 如何在 Python 多处理中使用类?

c++ - 在 C++ 流中使用 UTF-8 的正确跨平台方式

c++ - 将 streamsize 用于数组的大小不起作用

c++ - 帮助确定所需的窗口对话框资源类型