【问题标题】:C++ nested templates return type [duplicate]C ++嵌套模板返回类型[重复]
【发布时间】:2014-02-22 02:02:36
【问题描述】:

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

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() {
....
}

这是视觉工作室的错误

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

我是否遗漏了一些太明显的东西?

编辑:

啊.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>*

【问题讨论】:

  • @billz 但是foo 不是嵌套模板。
  • 试试template &lt;typename T&gt; A&lt;T&gt;::template node&lt;T&gt;* A&lt;T&gt;::foo() (注意添加的template 我猜是需要的,因为A::node 是一个依赖名称,并且需要告诉编译器它是一个模板才能解析以下内容&lt;T&gt;)

标签: c++ class templates nested


【解决方案1】:

好的。我冒昧地建议这是您可能需要的:

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

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

【讨论】:

  • 谢谢你的回复,一样的,我是模板新手,它在两个文件中,但如果我在声明之后有 #import "A.hxx" 给出同样的错误
  • #import ??嗯。你的意思是#include,对吧? (并且模板不进入 .cpp 文件,只进入标头,除了 非常罕见 情况)。所有这些都应该在 one 标题中。发布 real 代码将有助于 很多
  • 是的 #include 我的意思是,我有 A.h 和 A.hxx。也试过将它们放在同一个文件中,还是一样
  • @Koradi 在您的问题中发布这两个文件,将它们分开,并在您遇到错误的确切位置用评论标记(并确保您发布的文件显示错误)。还要发布您的编译器品牌和版本(gcc、vc++、clang 等)。我认为您使用的是 vc++,但我不知道是什么版本,甚至不知道这是否准确。你的错误表明它在A.cpp,所以也带上它。
  • @Koradi 在查看了您发布的更新后,1. 模板类A 中没有名为removeWithTwoChildren 的成员。有一个成员foo,所以定义一个未知的模板成员out-of-class 自然是行不通的。更新后(包括公开演示),See It Live
猜你喜欢
  • 2016-05-07
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多