将std :: vector作为模板模板参数传递时出错 - 在GCC中工作,在MSVC中失败

时间:2015-03-17 11:32:14

标签: c++ templates

以下代码

#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编译器版本)。这里有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分: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;
}

的工作。问题是这里有可变数量的模板参数...

编辑: 实际上没有可变数量的模板参数,因为我甚至可以用

编译它
template <template<typename...> class OutputContainerType, class InContainer>

因此MSVC编译器需要明确给出每种类型的模板。