2017-11-05 7 views
4

getは、outer<T>::inner<U>の専用コンストラクタにアクセスできる囲みスコープ内の関数を作成するにはどうすればよいですか?私はinnerを作ることによって、クラスの外にそれを宣言しようとしているテンプレート関数をテンプレート付きネストされたクラスのフレンドに宣言するには?

template <typename T> 
struct outer { 
    template <typename U> 
    class inner { 
     inner() {} 
    public: 
     friend inner get(outer&) { 
      return {}; 
     } 
    }; 
}; 


int main() { 
    outer<int> foo; 
    outer<int>::inner<float> bar = get<float>(foo); 
} 

template <typename V, typename W> friend inner<V> get(outer<W>&);持っているが、それはどちらか動作しませんでした。私はinnerを作ることによって、クラスの外にそれを宣言しようとしている

答えて

4

はあなたがgetが関数テンプレートであるコンパイラに伝えるために、friend宣言の前にテンプレート関数を宣言する必要がありますテンプレート<typename V, typename W> friend inner<V> get(outer<W>&);

を持っています。例えば総額で

// definition of outer 
template <typename T> 
struct outer { 

    // forward declaration of inner 
    template <typename U> 
    class inner; 
}; 

// declaration of get 
template <typename V, typename W> 
typename outer<W>::template inner<V> get(outer<W>&); 

// definition of inner 
template <typename T> 
template <typename U> 
class outer<T>::inner { 
    inner() {} 
    public: 
    // friend declaration for get<U, T> 
    friend inner<U> get<U>(outer<T>&); 
}; 

// definition of get 
template <typename V, typename W> 
typename outer<W>::template inner<V> get(outer<W>&) { 
    return {}; 
} 

LIVE

+0

神。 – user975989

+0

実際には、友人定義は、通常、事前にクラス外宣言がない限り、ADLを介してのみアクセス可能です。ここで同じ効果を達成する方法はありますか? – user975989

+0

@ user975989あなたはクラス外の定義を提供したくないということですか? – songyuanyao

関連する問題