我有以下内容:
#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类的情况下解决这个问题。
答案 0 :(得分:2)
第一个编译错误告诉你到底出了什么问题:did you forget 'typename'
由于S是模板的成员,您需要添加typename以告诉编译器在模板解析之前应该延迟查找名称:
template <class T>
std::vector<typename A<T>::S> A<T>::returnStructs(void)