Вот минимальный код:Неопределенная ссылка на статическую сопзЬ удвоится при использовании complex.h
#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();
}
Отмеченная линия дает undefined reference to `Test::dt'
. Я мог бы сделать временную переменную каждый раз, когда хочу умножить комплексное число с dt
, но это неудобно, так как я умножаю много статических константных членов с комплексными числами в моем коде.
Я думаю, что при умножении dt
с комплексным числом, то необходимо, по какой-то причине, адрес dt
(т.е. &dt
, что кажется странным.
Любые идеи, почему эта ошибка происходит и как сделать это работать более элегантно, чем делать double temp = dt;
перед каждым раз я хочу умножить его на комплексное число?
Этот код не должен компилироваться. Удалите 'static'. –
@HansPassant Да, он не компилируется, он дает неопределенные ссылки. Однако мне нужны статические константные переменные. – eimrek
Нет, он не скомпилирован из-за ключевого слова 'static':' error: 'constexpr', необходимый для инициализации класса статических данных in-class 'const double Test :: dt' нецелого типа. Я могу воспроизвести неопределенная эталонная ошибка после исправления ошибки компиляции. Это действительно похоже на ошибку компилятора. –