2017-09-21 15 views
0

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の関数を定義する任意の他の方法があるということです。たとえば、のタイプ名またはの完全な宣言なしの場合は、クラステンプレートを指定します。私は

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; 
} 

答えて

4

あなたはautoの助けを借りて、末尾の戻り値の型を使用することができます

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

どうもありがとうございます、これをより詳しく説明できますか? –

+0

@CherkesgillerTural確かなこと。だから、 'X *'を最初に置くと、コンパイラは 'X'があるはずなので、エラーになります。しかし、* after *を書くと、コンパイラは 'Sample 'の範囲を 'X'で調べることができます。これを前に置いた場合、 'Sample 'にまだ遭遇していないので、 'X 'を探すことはできません。詳細は、[こちら](http://en.cppreference.com/w/cpp/language/function)を参照してください。 – Rakete1111

+0

ありがとう、@ Rakete111。 –

関連する問題