【发布时间】:2017-07-09 04:30:57
【问题描述】:
#include<iostream>
using namespace std;
template<int N> class Prime
{ // generate N prime numbers at compile time
public:
unsigned int arr[N]{};
constexpr Prime() {
int k=0;
for(unsigned int i=2; k<N; i++) {
bool isPrime = true;
for(int j=0; j<k; j++) {
if(arr[j] > i/2) break;
if(i % arr[j] == 0) {
isPrime = false;
break;
}
}
if(isPrime) arr[k++] = i;
}
}
};
int main()
{
Prime<50000> prime; // if 50000->5000, ok
for(auto& a : prime.arr) cout << a << ' ';
}
G++ 无法编译此代码。它花了很长时间尝试编译,占用大量内存,最后崩溃了。
如果我将数字 50000 变小,或者去掉 constexpr,它就会编译。但我想使用更大的数组来节省时间。
任何想法都会受到赞赏。
【问题讨论】:
-
你看到了什么错误?
-
情况是这样的。编译器需要永远编译。使用了大量的记忆,最后只是崩溃..
-
您要求 gcc 使用元编程自行查找 1 到 50000 之间的所有素数。相当令人印象深刻,但这不是编译器的用途。你,先生/女士,今天赢得了互联网。
-
@AnT Coffee?更像是一种味道几乎但不完全不同于茶的饮料。
-
如果您确实需要前 50000 个素数,我建议您离线计算或下载它们并将它们存储在 constexpr 变量中。这是 kust 浪费的编译时间。
标签: c++ templates compiler-errors constexpr compile-time-constant