c – 与complex.h一起使用时对static const double的未定义引用
作者:互联网
这是最小代码:
#include <iostream>
#include <complex>
using namespace std;
class Test {
static const double dt = 0.1;
public:
void func();
};
void Test::func() {
cout << dt << endl; // OK!
cout << dt*complex<double>(1.0, 1.0) << endl; // Undefined reference
}
int main() {
Test a;
a.func();
}
注释的行给出了对`Test :: dt’的未定义引用.每次我想用dt乘以复数时,我都可以创建一个临时变量,但这很不方便,因为我在代码中将许多带有复数的静态const成员相乘.
我的猜测是,当将dt乘以复数时,由于某种原因,它需要dt的地址(即& dt,这看起来很奇怪).
任何想法为什么会发生这种错误,以及如何使它比做一个双重温度= dt更优雅;在每次我想将它与复数相乘之前?
解决方法:
…how to make it work…?
#include <iostream>
#include <complex>
using namespace std;
class Test {
static const double dt;
public:
void func();
};
//move initialization outside of class
const double Test::dt = 0.1;
void Test::func() {
cout << dt << endl; // OK!
cout << dt*complex<double>(1.0, 1.0) << endl; // Undefined reference
}
int main() {
Test a;
a.func();
}
或(有关说明,请参阅this question)
class Test {
static const double dt = 0.1;
public:
void func();
};
const double Test::dt;
或者(与上面的那个相同,但是使用c 11的constexpr)
class Test {
static constexpr double dt = 0.1;
public:
void func();
};
constexpr double Test::dt;
Any ideas why this error happens…?
从here开始:
If a static data member of integral or enumeration type is declared
const (and not volatile), it can be initialized with a initializer in
which every expression is a constant expression, right inside the
class definition…
因此,静态数据成员可以在类定义中初始化,如果它是int或enum类型并声明为const,则不是这种情况. (更多信息见this answer)
为什么它似乎适用于第一线?好吧,用clang编译我得到了:
warning: in-class initializer for static data member of type ‘const
double’ is a GNU extension
所以这个float类型初始化是gcc编译器的扩展,这个扩展可能不适用于期望引用类型参数的函数(现在只是猜测).
另请注意,这仅适用于c 98(c 11具有解决此问题的constexpr关键字)
标签:complex-numbers,c 来源: https://codeday.me/bug/20190829/1757341.html