从模板方法

时间:2018-03-08 21:48:11

标签: 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)
~~~~~~~~~~~~~~~~~~~~~~        ^

所以关于如何解决这个问题的想法?

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

1 个答案:

答案 0 :(得分:2)

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

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

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