2014-01-29 116 views
1

我试图从它的模板容器类返回一个嵌套的模板对象C++嵌套模板的返回类型

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>::[email protected][email protected]@' : 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>* 
+0

@billz但'foo'不是嵌套模板。 – Angew

+0

Try'template A :: template node * A :: foo()'(注意添加了'template',我猜是需要的,因为'A :: node'是一个独立的名字,编译器需要被告知,这是一个模板,以解析以下'') – leemes

回答

4

确定。我的肢体,表明这走出去是什么,你可能需要:

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

如果你想知道在哪里,从see this answer来了。 Johannes是C++和模板领域的绝对机器,并且坦诚地说忘记了更多关于该语言的知识比大多数人会知道的知道。阅读该帖子。您遇到的问题来自独立名称解析。你需要“告诉”编译器关注的东西也是一个模板。

+0

谢谢你的回复,这是相同的,我是新来的模板,它在两个文件,但如果我有声明后#import“A. hxx“给出同样的错误 – flanaras

+0

'#import' ??嗯。你的意思是'#include',对吗? (并且模板不会进入.cpp文件,只能进入头文件,除非非常少见的情况)。所有这些应该在*一个*标题中。发布*真实*代码将有助于*很多*。 – WhozCraig

+0

是#include我的意思是,我有A.h和A.hxx。已尝试让他们在同一个文件中,仍然是一样的东西 – flanaras