C++ 用户定义的文字无法包含其他文件
我有一个类Komp,其中我有一个用户定义的文本C++ 用户定义的文字无法包含其他文件,c++,include,user-defined-literals,cxxtest,C++,Include,User Defined Literals,Cxxtest,我有一个类Komp,其中我有一个用户定义的文本constexpr Komp操作符“”\u I(长双x),从中生成一个Komp对象,例如Komp k=1+5.0\u I 这在komp.cpp的main()中运行良好,但是当我在testing.cpp(其中包括komp.h)中编写相同的精确语句时,我得到以下错误。komp.h中的所有其他函数在testing.cpp中都能正常工作。我希望像其他函数一样包含用户定义的文本 为什么用户定义的文本在testing.cpp中不起作用,而其他函数却起作用? 错误
constexpr Komp操作符“”\u I(长双x)
,从中生成一个Komp对象,例如Komp k=1+5.0\u I代码>
这在komp.cpp的main()中运行良好,但是当我在testing.cpp(其中包括komp.h)中编写相同的精确语句时,我得到以下错误。komp.h中的所有其他函数在testing.cpp中都能正常工作。我希望像其他函数一样包含用户定义的文本
为什么用户定义的文本在testing.cpp中不起作用,而其他函数却起作用?
错误:
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.h
#包括
#伊夫德夫·康普
#定义KOMP_H
科姆班
{
公众:
双价1;
双价2;
// ...
Komp(常数倍x,常数倍y);
};
// ...
Komp操作员+(连续双倍左侧,连续双倍右侧);
Komp运算符“”_i(长双参数);
Komp运算符“”\u i(无符号长参数);
#恩迪夫
#包括“komp.h”
#包括
类测试:公共CxxTest::TestSuite{
公众:
无效文字测试(){
Komp c=3.0+Komp(2.0,2.0);//工作正常。重载+运算符没有问题
Komp b=5.0+2.0_i;//导致错误
Komp c=Komp(1.0,2.0);
TS_断言(b!=c);
}
};
此函数声明:
Komp operator ""_i(long double arg);
是对testing.cpp
或包含Komp.h
的任何文件可见的唯一文件。但是,您尚未在任何地方定义此函数
请注意,此定义:
constexpr Komp operator""_i(long double x) { // To match i.e Komp k = 1 + 2.3_i
return Komp(0.0, x);
}
是constexpr
,因此它是一个不同的函数。只需在Komp.h
中将函数声明为constepr
另外,您已经在Komp.cpp
中定义了Komp
类,以及Komp.h
。这在技术上是合法的,但前提是两个定义完全相同。在您的情况下,定义是不同的,这违反了“一个定义”规则,这意味着您的程序具有未定义的行为。您应该仅在Komp.h
中定义Komp
您的Komp类是如何在cpp和.h文件中定义的?代码在.h和.cpp文件中定义类Komp
。这不是通常的惯例;它是合法的,但通常的方法是将.cpp文件#包括该.h文件。这将解决此代码中的一个问题,即Komp
的两个定义不同。Re:“如果更改一个定义,但不更改另一个定义”--在本例中,这种情况已经发生。这两个定义不一样。@PeteBecker-True,我甚至没有注意到这一点;我以为OP复制粘贴了定义。谢谢你的更正,编辑了答案。
#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);
}
};
Komp operator ""_i(long double arg);
constexpr Komp operator""_i(long double x) { // To match i.e Komp k = 1 + 2.3_i
return Komp(0.0, x);
}