I have a class Komp where I have a user-defined literal constexpr Komp operator""_i(long double x)
to produce a komp object from e.g Komp k = 1 + 5.0_i;
.
This works fine in komp.cpp's main(), however when I write the same exact statement in testing.cpp (where komp.h is included) I get the error below. Every other function in komp.h works fine in testing.cpp. I expected the user-defined literal to be included as the other functions are.
Why is the user-defined literal not working in testing.cpp while other functions are?
The error:
Undefined symbols for architecture x86_64:
"operator"" _i(long double)", referenced from:
MyTestSuite::test5() in komp_testrunner-d3c20f.o
ld: symbol(s) not found for architecture x86_64
// komp.cpp
class Komp {
private:
double val1;
double val2;
public:
// ... Bunch of member-function headers
constexpr Komp(const double x, const double y) : val1(x), val2(y) {}
double v1() {return val1;}
double v2() {return val2;}
};
// ... Bunch of member and non-member functions.
Komp operator+ (const double lhs, const Komp rhs) { // overloads + operator for: double + Komp
return Komp(lhs+rhs.v1(), rhs.v2());
}
constexpr Komp operator""_i(long double x) { // To match i.e Komp k = 1 + 2.3_i
return Komp(0.0, x);
}
constexpr Komp operator""_i(unsigned long long x) { // To match i.e Komp k = 1 + 2_i
return Komp(0.0, x*1.0);
}
int main() { // Only here temporarily for testing purposes
Komp k = 1 + 2.0_i; // Works here
}
// komp.h
#include <string>
#ifndef KOMP_H
#define KOMP_H
class Komp
{
public:
double val1;
double val2;
// ...
Komp(const double x, const double y);
};
// ...
Komp operator+ (const double lhs, const Komp rhs);
Komp operator ""_i(long double arg);
Komp operator ""_i(unsigned long long arg);
#endif
#include "komp.h"
#include <cxxtest/TestSuite.h>
class Testing : public CxxTest::TestSuite {
public:
void literalTest () {
Komp c = 3.0 + Komp(2.0, 2.0); // Works fine. No problem with overloading + operator
Komp b = 5.0 + 2.0_i; // Causing an error
Komp c = Komp(1.0, 2.0);
TS_ASSERT(b != c);
}
};
This function declaration:
is the only one visible to
testing.cpp
, or any file that includesKomp.h
. However, you have not defined this function anywhere.Note that this definition:
is
constexpr
, so it's a different function. Simply declare the function asconstexpr
as well inKomp.h
.Also, you have defined the
Komp
class inKomp.cpp
, as well asKomp.h
. This is technically legal, but only if both the definitions are identical. In your case, the definitions are different, which violates the one-definition-rule, which means your program has undefined behavior. You should defineKomp
only inKomp.h
.