我正在尝试从其模板容器类返回嵌套模板对象
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/