.hpp
ファイルに分割されたテンプレートクラスと、.ipp
かなり長い型が含まれているクラスがあります。リファクタリング中に、コードをより読みやすくするために、その型の型エイリアスを記述したかったのです。しかし、私が何をしても、.ipp
ファイルで認識される型エイリアスを取得できません。
これが私がやろうとしていることの簡単な例です:
container.hpp:
template <class T>
class container {
public:
using TypeAlias = T;
container(const TypeAlias& a);
const TypeAlias& getA() const;
private:
TypeAlias a;
};
#include "container.ipp"
container.ipp:
template <class T>
container<T>::container(const TypeAlias& a) : a(a)
{
}
template <class T>
const TypeAlias& container<T>::getA() const
{
return this->a;
}
これをコンパイルすると、次のエラーが発生します。
./container.ipp:8:7: error: unknown type name 'TypeAlias'
const TypeAlias& container<T>::getA() const
明らかにこの場合、紹介することはあまり意味がありませんTypeAlias
が、私の実際のプログラムでは、それは大きな違いを生む可能性があります。TypeAliasを.ipp
ファイルで使用できるようにするためにできることはありますか?
のようcontainer<T>::getA
にクラスメンバーを定義すると、メンバーの名前(getA
ここ)の後のものはクラスのスコープで検索されますが、それより前のものは検索されません。基本的に、コンパイラーが順番に物事を理解しようとするとconst TypeAlias&
、宣言がで始まるとき、それがcontainer<T>
何TypeAlias
を意味するのかを理解するために内部を調べる必要があることをまだ知りません。
したがって、通常の関数構文を使用して、それがTypeAlias
メンバータイプであることを指定する必要があります。
template <class T>
const typename container<T>::TypeAlias& container<T>::getA() const
{
return this->a;
}
ただし、これは「トレーリングリターンタイプ」構文の利点の1つです(C ++ 11以降で有効)。順序を変更するだけで、リターンタイプ内のクラスのメンバーをより簡単に使用できます。
template <class T>
auto container<T>::getA() const -> const TypeAlias&
{
return this->a;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加