2012-03-27 3 views
6

Можно создать дубликат:
How to use enable_if to enable member functions based on template parameter of classповышение :: enable_if_c не похоже на работу

У меня есть шаблон класса:

template<typename T, size_t N> class Vector 

Я хочу, чтобы включить конструкторы для конкретных N, поэтому сделаю:

Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) { 
    data[0] = e0; 
    data[1] = e1; 
} 

Но компилятор (MSVC 2010 SP1) дает мне ошибку вместо применения SFINAE. Ошибка:

error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>' 
     with 
     [ 
      B=false, 
      T=float 
     ] 

В чем проблема? Это известная проблема? Как я могу это исправить? Это единственное решение для использования static_assert?

Edit: НКУ не удается либо: http://ideone.com/7Ejo8

+0

Можете ли вы опубликовать SSCE на ideone (и показать, что он скомпилирован успешно на gcc)? –

+0

@Ben Voigt: GCC тоже не скомпилирует его. –

+0

@ Vlad Lazarenko: Но там не очень хорошо описано, как это исправить. –

ответ

5

Вы не можете использовать enable_if разрешить/запретить функции-члены на основе параметров шаблона класса: enable_if могут быть применены только на функции или класса шаблонов.

В вашем случае единственное решение, о котором я могу думать, специализируется на всем классе, либо используя enable_if, либо более просто с частичной специализацией. Вы можете поместить общие элементы в общий базовый класс, чтобы не повторять их:

#include <cstdio> 

template<typename T, std::size_t N> 
struct VectorCommon 
{ 
    std::size_t size() { return N; } 
    void add(T const & element) { } 
}; 

template <typename T, std::size_t N> 
struct Vector : VectorCommon<T, N> 
{ 
}; 

template <typename T> 
struct Vector<T, 2> : VectorCommon<T, 2> 
{ 
    Vector(T const & e0, T const & e1) {} 
}; 

int main() 
{ 
    //Vector<int, 100> v100(12, 42); // compile error 

    Vector<char, 2> v2('a', 'b'); // ok 
} 
Смежные вопросы