模板类型别名

时间:2017-05-29 07:23:07

标签: c++ visual-c++ compiler-errors thrust

注意:滚动到问题的底部以进行更新。

使用Visual Studio 2017编译我的C ++程序时(使用/std:c++latest),我收到的错误是:

  

'thrust :: tuple_element':模板参数'N':'i':具有非静态存储持续时间的变量不能用作非类型参数

产生错误的代码部分如下:

namespace thrust
{
template<size_t i, class... Types>
using tuple_element_t = typename tuple_element<i,Types...>::type;

错误由以using开头的行专门产生。 Visual Studio提供的用于解释错误(https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2971)的链接非常简单,解释了局部变量不能用作模板参数。但是,我不明白在这种情况下该错误是如何应用的 - 参数i在上面的代码中被声明为size_t i,我理解这是定义模板的常规方法。

此外,在产生此错误后,Visual Studio会创建一个简短的弹出窗口,其中包含

  

Microsoft(R)C / C ++优化编译器已停止工作

     

Windows正在检查问题的解决方案......

然后在错误列表中第二个错误显示“无法从先前的错误中恢复;停止编译”。这个致命错误和上述错误是唯一的两个错误。

为什么编译器会产生第一个错误,我该如何解决?为什么这个错误会导致编译器像这样崩溃?

顺便说一句,错误产生代码中出现的tuple_element来自Thrust并行算法库(参见https://thrust.github.io/doc/structthrust_1_1tuple__element.html)。

附加说明:tuple_element_t的使用情况如下所示。

namespace tuple_repeat_ns
{
template<typename T, typename IndexSequence>
struct tuple_repeat_helper;

template<typename T, size_t... I>
struct tuple_repeat_helper<T, std::index_sequence<I...>>
{
    using type = tuple<tuple_element_t<I-I,tuple<T>>...>;
};

template<typename T, size_t N>
struct tuple_repeat_traits : tuple_repeat_helper<T,std::make_index_sequence<N>>
{
    using typename tuple_repeat_helper<T,std::make_index_sequence<N>>::type;
};

template<size_t I, typename T>
auto tuple_repeat_identity(const T& t)
{
    return t;
}

template<typename T, size_t... I>
auto tuple_repeat(const T& t, std::index_sequence<I...>)
{
    return make_tuple(tuple_repeat_identity<I>(t)...);
}
}

template<typename T, size_t N>
using tuple_repeat_t = typename tuple_repeat_ns::tuple_repeat_traits<T, N>::type;

template<size_t N, typename T>
auto tuple_repeat(const T& t)
{
    return tuple_repeat_ns::tuple_repeat(t, std::make_index_sequence<N>{});
}

template<size_t N, typename T>
struct computes_tuple_repeat
{
    auto operator()(const T& t) const
    {
        return tuple_repeat<N,T>(t);
    }
};

此外,这里有一些实际的编译器错误输出:

  

1&gt; [my_project] \ core \ thrust_wrapper.h(71):错误C2971:'thrust :: tuple_element':模板参数'N':'i':具有非静态存储持续时间的变量不能用作非类型参数
  1&gt; c:\ program files \ nvidia gpu computing toolkit \ cuda \ v8.0 \ include \ thrust \ tuple.h(67):注意:参见'thrust :: tuple_element'的声明
  1&gt; [my_project] \ core \ tuple_repeat.h(9):注意:见'i'的声明
  1&gt; [my_project] \ core \ tuple_repeat.h(9):注意:请参阅别名模板实例化'tuple_element_t&gt;'正在编制中       与
      [
          T =无符号字符
      ]
  1&gt; [my_project] \ core \ tuple_repeat.h(14):注意:请参阅类模板实例化'tuple_repeat_ns :: tuple_repeat_helper&gt;'正在编制中       与
      [
          T =无符号字符,
          _Ty = ::为size_t
      ]
  1&gt; [my_project] \ core \ tuple_repeat.h(32):注意:请参阅正在编译的类模板实例化'tuple_repeat_ns :: tuple_repeat_traits'的引用       与
      [
          T =无符号字符
      ]
  1&gt; [my_project] \ core \ types.h(39):注意:请参阅正在编译的别名模板实例化'tuple_repeat_t'的参考   1&gt; [my_project] \ core \ thrust_wrapper.h(71):致命错误C1903:无法从先前的错误中恢复;停止编译

感谢您的帮助!

更新:似乎替换tuple_repeat_helper中读取

的行
using type = tuple<tuple_element_t<I-I, tuple<T>>...>;

using type = tuple<typename thrust::tuple_element<I-I,tuple<T>>::type...>;

避免编译错误。这似乎解决了如何解决问题的问题,但是为什么开始出现错误对我来说仍然是一个谜。我基本上只是替换了别名的定义,而不仅仅是使用别名......并修复了它?

我可能会稍后尝试将更合适的可验证示例放在一起,并可能提交错误报告。

0 个答案:

没有答案