注意:滚动到问题的底部以进行更新。
使用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...>;
避免编译错误。这似乎解决了如何解决问题的问题,但是为什么开始出现错误对我来说仍然是一个谜。我基本上只是替换了别名的定义,而不仅仅是使用别名......并修复了它?
我可能会稍后尝试将更合适的可验证示例放在一起,并可能提交错误报告。