C++ 用户定义的文字无法包含其他文件

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中不起作用,而其他函数却起作用? 错误

我有一个类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中不起作用,而其他函数却起作用?

错误:

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);
}