2017-05-04 19 views
0

現時点では奇妙なことが起こっています。 VC++コンパイラを使用してテンプレートクラスを作成しようとしています。VC++クラステンプレートtypedef型で関数を実装する

私のクラスの中で私は明確にするためにいくつかのtypedefを得ました。私は私のHEADERFILE

template<typename T, 
    typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type> 
class Integer 
{ 
public: 
    typedef T      value_type; 
    typedef Integer <value_type> Self; 
    typedef Self&     SelfReference; 
    typedef Self*     SelfRawPointer; 
    ... 
public: 
    SelfReference operator =(const SelfReference); 

の外に持って実際の実装* .tcc - ファイル:

... 
template<typename T> Integer<T>::SelfReference Integer<T>::operator =(const 
Integer<T>::SelfReference rhs) 
{ 
    return this->assign(rhs); 
}; 
... 

私はこのようにそれを行うことによって、任意の問題を持っていないが、今のWindows上で、過去のgccでコンパイラは「SelfReference」という文句を言っています:C2061:構文エラー:識別子「SelfReference」

gccが過去に働いていたために何かが間違っていると私は気づいていません...インラインで関数を書くと、問題は表示されません。私は今、窓の上にこの種の問題があるのはなぜか不思議です!

template <typename T> 
typename Integer<T>::SelfReference Integer<T>::operator=(const typename Integer<T>::SelfReference rhs) { blah; } 

あなたもちょうどすなわち、SelfReference使用することができますInteger<T>::の右側には:

答えて

5

SelfReferenceしたがって、あなたがtypenameを使用する必要があり、依存タイプです。

template <typename T> 
typename Integer<T>::SelfReference Integer<T>::operator=(const SelfReference rhs) { blah; } 

これは、あなたが今書くことができるC++ 11でauto戻り値の理由の一部であった

template <typename T> 
auto Integer<T>::operator=(const SelfReference rhs) -> SelfReference 
{ 
    blah; 
} 
関連する問題