为什么我无法将我的代码编译为 c++ 11 并使用 srand48 函数?
我有一个程序,我在其中玩一些矩阵。问题是当我用-std=c++0x
标志编译代码时。我想使用一些仅限 c++11 的函数,这是我这样做的方法。如果我不指定 c++ 版本,它编译没有任何问题。像这样:
g++ -O2 -Wall test.cpp -o test -g
如果我误解了上述标志的作用,请纠正我。
我在 Windows 7 64 位机器上运行我的代码并通过 cygwin 编译。我使用 g++ 版本 4.5.3 (GCC)。如果需要更多信息,请发表评论。
由于某种未知的原因(甚至对我自己而言),我的所有代码都写在一个编译单元中。如果错误是由结构错误引起的,那么您也应该随时指出。:)
我收到以下错误:
g++ -std=c++0x -O2 -Wall test.cpp -o test -g
test.cpp: In function ‘void gen_mat(T*, size_t)’:
test.cpp:28:16: error: there are no arguments to ‘srand48’ that depend on a template parameter, so a declaration of ‘srand48’ must be available
test.cpp:28:16: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
test.cpp:33:28: error: there are no arguments to ‘drand48’ that depend on a template parameter, so a declaration of ‘drand48’ must be available
这是我的代码的一个子部分,它会生成上面显示的错误。
#include <iostream>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <limits.h>
#include <math.h>
#define RANGE(S) (S)
// Precision for checking identity.
#define PRECISION 1e-10
using namespace std;
template <typename T>
void gen_mat(T *a, size_t dim)
{
srand48(dim);
for(size_t i = 0; i < dim; ++i)
{
for(size_t j = 0; j < dim; ++j)
{
T z = (drand48() - 0.5)*RANGE(dim);
a[i*dim+j] = (z < 10*PRECISION && z > -10*PRECISION) ? 0.0 : z;
}
}
}
int main(int argc, char *argv[])
{
}
问候金。
这是为我解决问题的解决方案:
首先 nm 解释了 srand() 在编译时不能使用-std=c++0x
. 但是,要使用的正确标志是-std=gnu++11
它需要 g++ 版本 4.7+ 因此,我的解决方案是使用编译命令编译我的代码-std=gnu++0x
=g++ -O2 -Wall test.cpp -o test -g -std=gnu++0x