Невозможно получить доступ к псевдониму типа из определения шаблона класса в отдельном файле без ввода полного объявления типа псевдонима.

У меня есть шаблон класса, как 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

И определения есть в 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;
}

Мой вопрос заключается в том, есть ли другие способы определения функции GetNext. Например, без typename или без полного объявления шаблона класса Sample. Когда я меняю код на

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

Это работает, но я не могу использовать псевдоним типа здесь, например:

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

1 ответ

Вы можете использовать конечный тип возврата с помощью auto:

template<typename STA, typename STB>
auto Sample<STA, STB>::GetNext() const -> X* {
    return this->Next;
}
Другие вопросы по тегам