2017-11-25 8 views
0

私は、クラス2のgetGG()メソッドの返り値の戻り値の型をテンプレートパラメータとして指定しましたが、私のコードはコンパイルされません。どのようにそれを正しく行うには?テンプレートクラスメソッドの戻り値の型をチェックするには?

template <class T, class U> 
struct hasProperMethodReturnValueType { 
    static constexpr bool value = std::is_same<T, std::decltype(U.getGG())>; 
}; 

template<class P> class Class1 { 
private: 
    P gg; 
public: 
    Class1(P a) : gg(a) {} 
    P getGG() { 
     return gg; 
    } 
}; 

template<class A, class P> class Class3 { 
private: 
    P gg; 
    A dd; 
public: 
    Class3(P a, A r) : gg(a), dd(r) {} 
    P getGG() { 
     return gg; 
    } 
}; 

template<class G, class R> class Class2 { 
    static_assert(hasProperMethodReturnValueType<G, R>::value, "Not same type"); 
private: 
    R cc; 
public: 
    Class2(R r) : cc(r) {}; 
}; 

int main() { 
    auto obj = Class2<int, Class1<int> >(Class1<int>(3)); 
    auto obj2 = Class2<int, Class3<float, int> >(Class3<float, int>(0, 1.1)); 
    return 0; 
} 

コンパイルエラー:std::decltype(U.getGG())

error: template argument 2 is invalid 
    static constexpr bool value = std::is_same<T, std::decltype(U.getGG())>; 
+4

それは 'decltype'、ない'のstd :: decltype'です。それは言語機能です。 – DeiDei

答えて

1

UgetGGはメンバ関数であるが、タイプです。 U.getGG()は単に構文が無効です - メンバ関数を呼び出すためにUのインスタンスを "作成"する必要があります - std::declvalは未評価のコンテキストでそれを行うユーティリティです。またstd::decltypeは存在しません - decltypeはキーワードです。