c++ - 从模板方法返回在模板类内部声明的结构

标签 c++ c++11 templates compiler-errors nested

<分区>

我有以下内容:

#include <vector>

template <class T>
class A
{
public:
    struct S
    {
        int a;
    };

    std::vector<S>  returnStructs(void);
};

template <class T>
std::vector<A<T>::S>    A<T>::returnStructs(void)
{
}

int main(void)
{
}

但是当我尝试编译时我得到:

error: template argument for template type parameter must be a type; did you forget
      'typename'?
std::vector<A<T>::S>    A<T>::returnStructs(void)
            ^
            typename

所以我把那条线换掉了:

std::vector<A<int>::S>  A<T>::returnStructs(void)
              ^
              'int' instead of 'T'

但是我得到一个新的编译器错误:

error: return type of out-of-line definition of 'A::returnStructs' differs from that in the
      declaration
std::vector<A<int>::S>  A<T>::returnStructs(void)
~~~~~~~~~~~~~~~~~~~~~~        ^

那么关于如何解决这个问题有什么想法吗?


我也意识到我可以从类 A 中取出结构 S 并解决所有这些问题,但我仍然觉得应该可以在不更改类 A 的情况下解决这个问题。

最佳答案

第一个编译器错误告诉你到底出了什么问题:did you forget 'typename'

由于 S 是模板的成员,您需要添加 typename 以告诉编译器它应该延迟查找名称,直到解析模板之后:

template <class T>
std::vector<typename A<T>::S>    A<T>::returnStructs(void)

关于c++ - 从模板方法返回在模板类内部声明的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183041/

相关文章:

C++11 通过原始指针或引用获取 unique_ptr 的所有权?

c++ - xcode 7 如何抑制警告 "overrides a member function but is not marked ' override'”

c++ - 是否可以通过 Windows C++ 应用程序的唯一地址检测到蓝牙设备?

c++ - 延迟函数模板实例化

c++ - 具有公共(public)基础的派生类的模板特化

c++ - 对于每个模板类型,一个集合类型的参数

c++ - 为每个可变参数模板参数和一个数组调用一个函数

C++通过类模板函数中的指针访问类方法

C++ 简单的从二进制转换为十进制

使用 g++ 4.6 和 boost::unordered_map 的 C++11 相关编译错误