1

テンプレート クラスの制限に従っていましたが、gcc でエラーが発生しました。

エラー: 1 つの宣言で複数の型

エラー: 宣言は何も宣言していません

enable_if ブロックを削除するとコンパイルされます。何かが足りない場合、誰かが説明できますか?

template<class A, class B, class C, class D>                                                                               
typename std::enable_if<                                                  
std::is_base_of<baseofA, A>::value &&                      
std::is_base_of<baseofB, B>::value &&      
std::is_base_of<baseofC, C>::value &&            
std::is_base_of<baseofD, D>::value>::type       
class library {
    //whatever
};
4

2 に答える 2

3

enable_if正しく使用していません。static_assertこの場合はより適切です。

template<class A, class B, class C, class D>       
class library {
  static_assert(
    std::is_base_of<baseofA, A>::value &&                      
    std::is_base_of<baseofB, B>::value &&      
    std::is_base_of<baseofC, C>::value &&            
    std::is_base_of<baseofD, D>::value, 
    "template argument A must derive from baseofA and so on ..." );
      //whatever
};

代わりに使用enable_ifする場合は、有効なタイプに依存するダミーのテンプレート パラメータを作成して、必要に応じて機能させる必要があります。

template<class A, 
         class B, 
         class C, 
         class D, 
         class _ = 
           typename std::enable_if<                                                  
             std::is_base_of<baseofA, A>::value &&                      
             std::is_base_of<baseofB, B>::value &&      
             std::is_base_of<baseofC, C>::value &&            
             std::is_base_of<baseofD, D>::value>
           ::type>
class library {
    //whatever
};

しかし、IMO、後者の場合に名前がstatic_assert付けられた型が見つからないことについてコンパイラが不平を言う代わりに、説明的なエラーメッセージを提供できるため、この方法の方が優れています。type

于 2012-06-12T03:08:03.050 に答える
0

このページに従って、試してください

template<class A, class B, class C, class D, class Enable = void>
class library;

template<class A, class B, class C, class D>                                                                      
class library<A, B, C, D, typename std::enable_if< std::is_base_of<baseofA, A>::value &&
                                                   std::is_base_of<baseofB, B>::value &&
                                                   std::is_base_of<baseofC, C>::value &&
                                                   std::is_base_of<baseofD, D>::value >::type
             >
{
    //whatever
};

enable_if<>::type は型であり、template<> 行とクラス ライブラリ行の間では望ましくないため、例に何か問題があることに注意してください。

于 2012-06-12T03:19:40.730 に答える