【问题标题】:Error passing std::vector as a template template parameter - works in GCC, fails in MSVC将 std::vector 作为模板模板参数传递时出错 - 在 GCC 中有效,在 MSVC 中失败
【发布时间】: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 作为输出类型,它可以编译。

标签: c++ templates


【解决方案1】:

代码:

#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 编译器需要明确给出每种类型的模板。

【讨论】:

  • 谢谢!问题似乎出在默认模板参数上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多