2015-03-23 5 views
0

Ниже не компилируетсяМожно ли форматировать объявленные типы шаблонов, участвующих в специализации шаблонов?

#include <iostream> 
#include <type_traits> 

// forward declaration of a type template 
template<class T, class Alloc = std::allocator<T>> class std::vector; 

template<class T> 
struct is_vector : std::false_type { }; 

// using the forward declared type template 
template<class T, class Alloc> 
struct is_vector<std::vector<T, Alloc>> : std::true_type { }; 


#include <vector> 

int main() 
{ 
    std::cout << is_vector<std::vector<int>>::value << std::endl; 
} 

Я хочу, чтобы убедиться, что прогностическая объявил шаблоны типа (выше vector), на самом деле не полезной в специализации условиях и что это не дефектный реализации виноват. Также почему это происходит? Я не хочу создавать объект типа vector<> использовать его только как тег для отправки между специализациями; не включает <vector> в точке создания экземпляра (назовите сайт is_vector<>)?

+0

Ваше опережающее объявление неправильно. – Jarod42

ответ

4

Прогнозные декларирование стандартной библиотеки контейнера is undefined behavior (если вам удастся собрать его), так что для std::vector вы должны #include <vector> перед определением is_vector.

Для ваших собственных типов вы можете сделать это, хотя:

// forward declaration of a type template 
namespace my { 
    template<class T, class Alloc> class vector; 
} 

template<class T> 
struct is_vector : std::false_type { }; 

// using the forward declared type template 
template<class T, class Alloc> 
struct is_vector<my::vector<T, Alloc>> : std::true_type { }; 

namespace my { 
    template<class T, class Alloc = std::allocator<T>> class vector {}; 
} 
+0

Я получил вариант кода, о котором идет речь, для компиляции в VS2012 (он не работает в gcc), поэтому запутался во всей ситуации. Thnx для информации –

Смежные вопросы