模板元编程静态成员函数无法获得类的静态静态值
template metaprogramming static member function cannot get const static value of class
我正在尝试在编译时间和尝试模板中生成数字。但是,当我使用constexpr static
成员变量而不是enum
,然后在static
成员函数中尝试将其推入std::vector
时,编译器告诉我链接器无法链接。
例如,这是一个简单的程序,用于计算n
的阶乘。
#include <iostream>
#include <vector>
template <uint64_t n> struct factorial {
constexpr static uint64_t value = factorial<n - 1>::value * n;
static void put(std::vector<uint64_t> &v) {
factorial<n - 1>::put(v);
v.push_back(value);
}
};
template <> struct factorial<0> {
constexpr static uint64_t value = 1;
static void put(std::vector<uint64_t> &v) {
v.push_back(1);
}
};
int main() {
using namespace std;
vector<uint64_t> v;
factorial<10>::put(v);
for (auto fact: v)
cout << fact << endl;
return 0;
}
这将与G 7.1和Clang 4.0同时产生链接失败信息,因此我认为这不是错误。当我将constexpr static
更改为 enum
时
template <uint64_t n> struct factorial {
enum { value = factorial<n - 1>::value * n };
static void put(std::vector<uint64_t> &v) {
factorial<n - 1>::put(v);
v.push_back(value);
}
};
template <> struct factorial<0> {
enum { value = 1 };
static void put(std::vector<uint64_t> &v) {
v.push_back(1);
}
};
它编译和链接并运行良好。
我想知道是否提到了C 标准。
据我所知,这是因为 std::vector<T>::push_back()
具有签名
void push_back(V const&)
。
因此,正在提到价值。
因此,它必须具有一个地址,这不是因为它从未定义(尽管对我来说似乎有点不合逻辑) - 也许这是在C 17中固定的?
可以通过取副本并推动它来编译:
#include <iostream>
#include <vector>
template <uint64_t n> struct factorial {
constexpr static uint64_t value = factorial<n - 1>::value * n;
static void put(std::vector<uint64_t> &v) {
factorial<n - 1>::put(v);
auto vcpy = value; // *** HERE ***
v.push_back(vcpy);
}
};
template <> struct factorial<0> {
constexpr static uint64_t value = 1;
static void put(std::vector<uint64_t> &v) {
v.push_back(1);
}
};
int main() {
using namespace std;
vector<uint64_t> v;
factorial<10>::put(v);
for (auto fact: v)
cout << fact << endl;
return 0;
}
尝试(在第一个示例中)添加
template <uint64_t n>
constexpr uint64_t factorial<n>::value;
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- #为""定义宏;静态";针对不同的上下文
- cmake如何在fedora工作站中找到boost静态库包
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- cmake在我的项目中所需的所有静态库都不成功
- 今天的主流编程语言主要使用动态还是静态(词汇)作用域?
- 用C 元编程构建静态字符串
- 模板元编程静态成员函数无法获得类的静态静态值
- 如何在静态单例类中以编程方式从exec方法返回
- 通过元编程自动+静态类内常量初始化
- C++模板元编程静态类型检查
- 尽管模板是静态绑定的,但旧代码的对象文件为什么以及如何使用使用通用编程范式的新代码
- 打印用于模板元编程的静态变量
- 使用模板元编程实现 std::all_of 的静态版本
- C++编程中的静态成员
- 是否可以通过编程方式创建函数静态对象
- CRTP、模板、元编程、转发和静态成员:g++ 4.8 中的一个错误
- 通过元编程或其他方式自动注册dll模块中的静态对象工厂
- 静态变量对于各种编程语言和环境通常意味着什么