2017-03-29 5 views
0

私は友人の機能友達につくが

template <typename T> 
class X{ 
public: 
    class Y{ 
    public: 
     int y; 
    }test; 
public: 
    X(){ 
     test.y=10; 
    } 

    template <typename U> 
    friend Y fun(X<U>); 
}; 


template <typename T> 
X<T>::Y fun(X<T> x){ 
    return x.test; 
} 

を使用して、ネストしたクラスのオブジェクトを返すようにしたいしかし、私はので、「X :: Y」の前に

必要性「型名」を言ってエラーが出ますX 'は従属スコープです

何が問題なのですか? X<T>::Ytypenameを置く:

template <typename T> 
typename X<T>::Y fun(X<T> x){ 
    return x.test; 
} 

X<T>::Yの意味はT上のタイプに依存しているため、コンパイラはX<T>::Yが参照するかどうかを一般的に知ることができないあなたは、エラーが言う文字通り実行する必要があり

+1

'Xは依存スコープであるため' X :: Y 'の前に 'typename'が必要です' 'X :: Y'の前に' typename'が必要です。 – DeiDei

+0

'X 'は従属スコープです。 – Quentin

答えて

1

型名または変数。このような状況では、typenameにしたい場合は、typenameキーワードで明示的に言う必要があります。 Yが提出またはタイプされている場合は、compliler becouse

template <typename T> 
typename X<T>::Y fun(X<T> x){ 
    return x.test; 
} 

を記述する必要が

関連する問題