1

我遵循模板类限制,但在 gcc 中遇到错误:

错误:一个声明中有多种类型

错误:声明没有声明任何东西

如果我删除 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 回答