2015-03-17 2 views
8

Следующий кодОшибка прохождения зЬй :: вектор в качестве параметра шаблона шаблон - работает в GCC, терпит неудачу в MSVC

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <deque> 
#include <functional> 

#define BEGIN_TO_END(container) container.begin(), container.end() 

template <template<typename...> class OutputContainerType, class InContainer> 
OutputContainerType<typename InContainer::value_type> convertContainer(const InContainer& in) 
{ 
    OutputContainerType<typename InContainer::value_type> result; 
    std::transform(BEGIN_TO_END(in), std::back_inserter(result), [](typename InContainer::value_type value) {return value;}); 
    return result; 
} 

int main() { 
    std::deque<int> d {1, 2, 3}; 
    const auto v = convertContainer<std::vector>(d); 
    std::cout << v.size() << std::endl; 
} 

отлично работает с GCC (link). Однако он не компилируется с MSVC 2013 (12.0) с ошибкой: 'std::vector' : class has no constructors (может быть протестирован here, выберите версию компилятора 12.0). В чем проблема, и как я могу это исправить?

+2

Нет проблем. Просто в MSVC, как обычно, есть ошибка в этом случае. – Nawaz

+0

@Nawaz: трудно поверить, что что-то такое же, как и шаблонный шаблонный параметр, не будет покрываться испытаниями компилятора. Или это вызвано тем, как определяется «std :: vector»? .. –

+0

КПП. BEGIN_TO_END может быть разрешен Boost.Range: http://www.boost.org/doc/libs/1_57_0/libs/range/doc/html/range/reference/algorithms/mutating/transform.html. Использование макроса не является хорошим стилем. – sfrehse

ответ

4

Код:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <deque> 
#include <functional> 

#define BEGIN_TO_END(container) container.begin(), container.end() 

template <template<typename T, typename T2> class OutputContainerType, class InContainer> 
OutputContainerType<typename InContainer::value_type, std::allocator<typename InContainer::value_type>> convertContainer(const InContainer& in) 
{ 
    OutputContainerType<typename InContainer::value_type, std::allocator<typename InContainer::value_type>> result; 
    std::transform(BEGIN_TO_END(in), std::back_inserter(result), [](typename InContainer::value_type value) {return value;}); 
    return result; 
} 

int main() { 
    std::deque<int> d {1, 2, 3}; 
    const auto v = convertContainer<std::vector>(d); 
    std::cout << v.size() << std::endl; 
} 

работал. Проблема заключается в том, то с VARIADIC числом параметров шаблона здесь ...

EDITED: На самом деле не с VARIADIC числом параметров шаблона, как я могу даже скомпилировать его с

template <template<typename...> class OutputContainerType, class InContainer> 

так в MSVC компилятор явно задает каждому типу шаблона.

+0

Спасибо! Кажется, что проблема связана с параметром шаблона по умолчанию. –