如果不键入别名类型的完整声明,则无法从单独文件中的类模板定义访问类型别名

Che*_*ler 1 c++ templates generic-programming c++11 c++14

我有一个类似Sample.hpp 的类模板 ,其类型别名为X

#ifndef SAMPLE_HPP
#define SAMPLE_HPP

template<typename STA, typename STB>
class Sample
{
    using X = Sample<STA,STB>;

public:
    Sample();
    inline X* GetNext() const;

private:
    X* Next;
};

#include "Sample.cpp"

#endif // SAMPLE_HPP
Run Code Online (Sandbox Code Playgroud)

定义位于Sample.cpp中。

#include "Sample.hpp"

template<typename STA, typename STB>
Sample<STA,STB>::Sample() {
    Next = nullptr;
}

template<typename STA, typename STB>
typename Sample<STA,STB>::X* Sample<STA,STB>::GetNext() const {
    return this->Next;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,还有其他方法来定义GetNext函数吗?例如,没有类型名或没有示例类模板的完整声明。当我将代码更改为

template<typename STA, typename STB>
Sample<STA,STB>* Sample<STA,STB>::GetNext() const {
    return this->Next;
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但我不能在这里直接使用类型别名,例如:

template<typename STA, typename STB>
X* Sample<STA,STB>::GetNext() const {
    return this->Next;
}
Run Code Online (Sandbox Code Playgroud)

Rak*_*111 5

您可以在以下命令的帮助下使用尾随返回类型auto

template<typename STA, typename STB>
auto Sample<STA, STB>::GetNext() const -> X* {
    return this->Next;
}
Run Code Online (Sandbox Code Playgroud)