gpt4 book ai didi

c++ - Eigen 库 : Assertions failed in a template

转载 作者:行者123 更新时间:2023-11-27 23:53:31 26 4
gpt4 key购买 nike

我有一个模板化函数,它应该根据模板参数生成一个编译时已知的固定大小 Vector:

template <int nSize> 
Eigen::Matrix<double, nSize, 1> myFunc()
{
switch(nSize){
case 2: return ExternalLibrary::generate_Vector_2d();
case 3: return ExternalLibrary::generate_Vector_3d();
}
}

但是,当我编译这段代码时,我得到一个失败的断言,因为 Vector_2d 大小不适合 3d 大小:

Eigen::Vector3d testVector3d = myFunc<3>(); // failed, because 3d doesn't fit the theoreticelly possible 2d 

基本上,失败的断言是可以理解的,但当然这在运行时永远不会成为问题。我怎样才能绕过这个失败的断言?还是有比 switch 条件更优雅的方式?

谢谢!

最佳答案

只声明模板函数而不定义它,然后定义两个特化:

template <int nSize>
Eigen::Matrix<double, nSize, 1> myFunc();

template <>
Eigen::Matrix<double, 2, 1> myFunc<2>()
{
return ExternalLibrary::generate_Vector_2d();
}

template <>
Eigen::Matrix<double, 3, 1> myFunc<3>()
{
return ExternalLibrary::generate_Vector_3d();
}

编译器,虽然它会消除死代码作为一种优化,无论如何都必须验证死代码的有效性,这意味着它必须确保 ExternalLibrary::generate_Vector_3d() 的返回类型。可以转换为Eigen::Matrix<double, 2, 1> ,即使可以证明该 return 语句无法执行。由于不允许进行此转换,因此会出现编译时错误。

通过将两个 return 语句分离到单独的特化中,您消除了这个问题,因为它删除了 return ExternalLibrary::generate_Vector_3d();来自可以返回Eigen::Matrix<double, 3, 1>以外的东西的函数语句.


请注意,使用 myFunc()nSize 2 或 3 以外的值将导致链接时错误。我们可以通过提供无法实例化的主体将此错误移至编译时,但(表面上)取决于 nSize这样编译器就不会在使用之前尝试实例化它:

template <int nSize>
Eigen::Matrix<double, nSize, 1> myFunc()
{
// With C++11, the following line provides a more useful diagnostic. If
// you don't have C++11 support, remove it and the bad return statement
// will do the job, albeit with a more cryptic error message.
static_assert((static_cast<void>(nSize), false), "Invalid template parameter nSize");

return static_cast<class INVALID_NSIZE_PARAMETER**********>(nSize);
}

这将提供指向错误使用 myFunc() 的诊断.例如,如果没有 C++11 支持,您会看到如下内容:

main.cpp:12:12: error: cannot cast from type 'int' to pointer type 'class INVALID_NSIZE_PARAMETER **********'
return static_cast<class INVALID_NSIZE_PARAMETER**********>(nSize);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:29:5: note: in instantiation of function template specialization 'myFunc<4>' requested here
myFunc<4>();
^

关于c++ - Eigen 库 : Assertions failed in a template,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44375680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com