2015-03-17 39 views
8

Hata - GCC çalışan 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) ile iyi çalışır aşağıdaki kod başarısız olur. Ancak, MSVC 2013 (12.0) ile hata: 'std::vector' : class has no constructors (here test edilebilir, 12.0 derleyici sürümü seçin) ile derleme. Burada sorun nedir ve nasıl düzeltebilirim?

+2

Sorun değil. Sadece bu MSVC, her zamanki gibi, bu durumda hata vardır. – Nawaz

+0

@Nawaz: Şablon şablonu parametresi kadar basit bir şeyin derleyici testlerinin kapsamına girmeyeceğine inanmak zor. Yoksa std :: vector' nasıl tanımlanır? .. –

+0

Btw. BEGIN_TO_END, Boost.Range tarafından çözülebilir: http://www.boost.org/doc/libs/1_57_0/libs/range/doc/html/range/reference/algorithms/mutating/transform.html. Makro kullanmak iyi bir stil değildir. – sfrehse

cevap

4

kodu: Çalıştığı

#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; 
} 

. Aslında şablon parametrelerinin variadic numarası ile o kadar

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

MSVC ile derlemek bile edemez olarak: Sorun ... Burada şablon parametrelerinin variadic numarası ile sonra

REDAKTE olduğunu Derleyici, şablonun her türüne açıkça ihtiyaç duyar.

+0

Teşekkürler! Sorun o zaman varsayılan şablon parametresiyle görünüyor. –