在c++模板参数中未使用constexpr
Not using constexpr in c++ template arguments
我正在处理一个类型为itk::Image<OutputPixelType, Dimension>
的变量,其中"itk"来自图像处理库itk。
以下代码编译:
constexpr unsigned int Dimension = 3;
using PixelType = float;
using MyImageType = itk::Image<PixelType, Dimension>;
但现在我需要将"维度"定义为从函数计算得到的东西。
unsigned int Dimension = get_dimension(...);
我的编译器给出一个错误:
error: non-type template argument is not a constant expression
using MyImageType = itk::Image<PixelType, Dimension>;
^~~~~~~~~
我该如何解决这个问题?我希望使用"维度"作为从函数计算的东西。
您的get_dimension
函数应该是constexpr
,如果是这样的话,您可以有以下内容:
constexpr unsigned int Dimension = get_dimension(...);
示例
假设您有以下简化类:
template <int v>
class Foo {
public:
constexpr Foo()
: v_(v)
{}
private:
int v_;
};
然后是以下内容:
int v = get();
using FooInt = Foo<v>;
其中get
函数定义如下:
int get() {
return 1;
}
您将得到与您在示例中得到的错误相同的错误。
因此,解决方案将标记get
函数constexpr
,并使v
值也是constexpr
,类似于:
constexpr int get() {
return 1;
}
constexpr int v = get();
using FooInt = Foo<v>;
看看演示
更新
为了能够使用模板,编译器需要在编译时知道模板参数,因此,如果Dimension
不是constexpr
(它声明可以在编译时评估变量的值(变量,则不能将其用作模板参数。
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 在更改for循环的第三部分后,未使用for循环结果
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用typeid警告未使用的变量
- C++删除未使用的类属性会导致 std::logic_error
- 警告 C4552:">>":未使用表达式的结果
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 在非 constexpr 函数中作为左值传递的变量上使用 'constexpr' 函数
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 可视化C++载体:未使用的容量
- GCC 中 __attribute__((未使用)) 和 __attribute((未使用)) 之间的区别
- 循环访问还包含未使用元素的字符串数组
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- 如果在 lambda 中使用 Constexpr static_assert,哪个编译器是正确的?
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 如何标记 constexpr 函数的参数未使用?
- 如何使用未使用的宏在CONSTEXPR函数中沉默警告