2012-02-20 13 views
13

クラスが継承リストにdecltypeを持つことができないのはなぜですか?例えば、私は次のコードは、RTypeからA<B>継承を行うことを期待するが、G ++ 4.6.1(-std=c++0xを使用)と、それはコンパイルされません:クラスが宣言型の結果から継承できないのはなぜですか?

test.cpp:6:18: error: expected class-name before 'decltype' 
test.cpp:6:18: error: expected '{' before 'decltype' 
test.cpp:6:54: error: expected unqualified-id before '{' token 
test.cpp: In function 'int main()': 
test.cpp:16:7: error: aggregate 'A<B> a' has incomplete type and cannot be defined 

#include <type_traits> 

template<typename T> 
class A : public decltype(std::declval<T>().hello()) { }; 

class RType { }; 

class B { 
public: 
    RType hello() { return RType(); } 
}; 

int main() { 
    A<B> a; 
} 

それは次のような出力を提供します

declvalを使用すると、decltypeを使用する必要があるインスタンスを提供するだけですが、decltypeのその他の使用も失敗します(つまり、declvalなし)。

+3

gcc 4.7、clangまたは他のコンパイラを試しましたか? gccはまだ完全にC++ 11に準拠していません... – PlasmaHH

+1

@PlasmaHH私は実際に(他の理由で)clangをコンパイルしようとしていますが、MSVC++ 2010では動作しません。 –

答えて

19

許可されています:

10.1: "基底クラスのリストは、表記法を使用してクラス定義で指定することができます:"

class-or-decltype: 
nested-name-specifieropt class-name 
decltype-specifier 

ので、私はあなたのコンパイラがバグ

+0

Eclipse CDTではこれも構文エラーとして報告しますが、実際にはコンパイルされます。 – WorldSEnder

10

a bug in GCCのようです。 4.7を試してください。

3

Aを持っていると思います回避策:

template <typename T> 
class ID 
{ 
public: 
    typedef T type; 
}; 

template<typename T> 
class A : public ID<whatever>::type { }; 
+0

関数の戻り値の型である型から継承していることに注目してください。これは同じことをすることはできません。 –

+3

@Seth:その意味は、テンプレートクラスA:パブリックID ())> :: type {}; 'を試すことでした。 – ildjarn

+0

@ildjarnあなたはおそらく正しいでしょう、遠いと思っていない –

-2

template<typename T> 
class A : public result_of<T::hello()> 

この構文では静的メンバー関数が必要になる可能性がありますが、decltypeの動作を妨げる同じバグが発生する可能性があります。

関連する問題