Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;嵌套模板返回类型_C++_Class_Templates_Nested - Fatal编程技术网

C++ C++;嵌套模板返回类型

C++ C++;嵌套模板返回类型,c++,class,templates,nested,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>
class A {
    template <typename S>
    struct node {
        S value;
        struct node<S>* right;
        ....
    };
    private:
        ....
        node<T>* foo();
}
模板
甲级{
样板
结构节点{
S值;
结构节点*右;
....
};
私人:
....
node*foo();
}
那我就吃吧

template <typename T>
A<T>::node<T>* A<T>::foo() {
....
}
模板
A::node*A::foo(){
....
}
这是VisualStudio的错误

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
1>A.cpp
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(576):警告C4346:'A::?$node@$RT@BAAB@“:依赖名称不是类型
1> 使用“typename”前缀表示类型
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(576):错误C2143:语法错误:缺少“;”在“*”之前
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(576):错误C2065:“T”:未声明的标识符
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(576):错误C2923:'A':'T'不是参数'T'的有效模板类型参数
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(576):错误C2923:'A::node':'T'不是参数'S'的有效模板类型参数
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(613):错误C2509:“foo”:成员函数未在“A”中声明
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.h(11):参见“A”的声明
1> c:\users\user\dropbox\visualstudio projects\fooProj\fooProj\A.cpp(613):致命错误C1903:无法从以前的错误中恢复;停止编译
我是不是错过了太明显的东西

编辑:

A.h
\ifndef TEMP\u H
#定义温度
样板
甲级{
样板
结构节点
{
S值;
结构节点*右;
结构节点*左;
};
私人:
节点*removeWithTwoChildren();
};
样板
A::模板节点*A::removeWithTwoChildren(){
临时工=新的临时工;
返回温度;
}
#恩迪夫
它不需要是一个结构,我也可以使用一个类

我正在使用vc++2013

我遇到问题的地方是返回类型声明

A<T>::template node<T>*
A::模板节点*
我想回去

node<T>*
节点*

好的。我站在一个肢体上,想表明这是你可能需要的:

template<typename T>
typename A<T>::template node<T>* A<T>::foo()
{
    // your stuff goes here   
}
模板
typename A::模板节点*A::foo()
{
//你的东西放在这里
}

以防你想知道那是从哪里来的。Johannes是C++和模板领域的绝对机器,坦白地说,人们已经忘记了更多的语言。读那篇文章。您遇到的问题来自从属名称解析。您需要“告诉”编译器接下来要做的事情也是一个模板。

好的。我站在一个肢体上,想表明这是你可能需要的:

template<typename T>
typename A<T>::template node<T>* A<T>::foo()
{
    // your stuff goes here   
}
模板
typename A::模板节点*A::foo()
{
//你的东西放在这里
}

以防你想知道那是从哪里来的。Johannes是C++和模板领域的绝对机器,坦白地说,人们已经忘记了更多的语言。读那篇文章。您遇到的问题来自从属名称解析。您需要“告诉”编译器接下来要做的事情也是一个模板。

@billz但是
foo
不是嵌套模板。请尝试
template a::template node*a::foo()
(请注意添加的
模板
,我想这是必需的,因为
A::node
是一个依赖名称,需要告诉编译器它是一个模板,以便解析以下
)@billz但是
foo
不是嵌套模板。请尝试
template A::template node*A::foo()
(请注意添加的
模板
,我猜这是必需的,因为
A::node
是一个依赖名称,需要告诉编译器它是一个模板,以便解析以下
)谢谢您的回复,这是一样的,我对模板不熟悉,它在两个文件中,但如果在声明之后导入“A.hxx”给出了相同的错误
#import
?嗯。你的意思是
#include
,对吗?(模板不进入.cpp文件,只有在非常罕见的情况下才会进入标题)。所有这些都应该放在一个标题中。发布真实代码会有很大帮助。是的#包括我的意思是,我有a.h和a.hxx。我也尝试过将它们放在同一个文件中,仍然相同thing@Koradi在你的问题中张贴这两个文件,将它们分开,并在你遇到错误的地方加上注释(并确保您发布的文件显示错误)。同时发布您的编译器品牌和版本(gcc、vc++、clang等)。我想你使用的是vc++,但我不知道是什么版本,甚至不知道它是否准确。你的错误表明它在
A.cpp
中,所以也带上它。@Koradi在查看你发布的更新后,1.在模板类
A
中没有名为
removeWithTwoChildren
的成员。有一个成员
foo
,所以natu在类外集合未知模板成员的定义将不起作用。更新后(包括为演示公开内容),感谢您的回复,这是一样的,我是模板新手,它在两个文件中,但如果在声明后导入“A.hxx”给出了相同的错误
#import
?嗯。你的意思是
#include
,对吗?(模板不进入.cpp文件,只有在非常罕见的情况下才会进入标题)。所有这些都应该放在一个标题中。发布真实代码会有很大帮助。是的#包括我的意思是,我有a.h和a.hxx。我也尝试过将它们放在同一个文件中,仍然相同thing@Koradi在你的问题中张贴这两个文件,将它们分开,并在你遇到错误的地方加上注释(并确保您发布的文件显示错误)。同时发布您的编译器品牌和版本(gcc、vc++、clang等)。我认为您使用的是vc++,但我不知道您使用的是哪个版本
template<typename T>
typename A<T>::template node<T>* A<T>::foo()
{
    // your stuff goes here   
}