【发布时间】:2015-03-17 11:32:14
【问题描述】:
以下代码
#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 编译器版本)。这里有什么问题,我该如何解决?
【问题讨论】:
-
没问题。只是 MSVC 像往常一样在这种情况下存在错误。
-
@Nawaz:很难相信像模板模板参数这样基本的东西不会被编译器测试覆盖。还是由
std::vector的定义方式引起的?.. -
顺便说一句。 BEGIN_TO_END 可以通过 Boost.Range 解析:boost.org/doc/libs/1_57_0/libs/range/doc/html/range/reference/…。使用宏不是一种好的风格。
-
@sfrehse:我的项目中没有使用 boost。通常应该避免使用宏,但它们有一个特定的地方可以帮助改进代码并完成没有预处理器不可能完成的事情。这是其中一种情况。
-
很好奇,这应该有效吗?如果我编写模板
并在 main 调用中使用 std::vector 作为输出类型,它可以编译。