其他分享
首页 > 其他分享> > c – 与complex.h一起使用时对static const double的未定义引用

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