测试内联函数的问题

gtest problem with inline function

本文关键字:问题 函数 测试      更新时间:2023-10-16

你好,我有其中包括内联函数,当我尝试测试这个类与谷歌测试,我有错误,如:

 error LNK2019: unresolved external symbol "public: double __thiscall Math::returnPi(void)" (?returnPi@Math@@QAENXZ) referenced in function "private: virtual void __thiscall Speed_Math_Test::TestBody(void)" (?TestBody@Speed_Math_Test@@EAEXXZ)

例如my class(头文件)

class Math
{
public:
    Math(void);
    inline double returnPi();
    ~Math(void);
};

my class(cpp file)

Math::Math(void)
{}
Math::~Math(void)
{}
double Math::returnPi()
{ return 3.14;}
测试:

TEST(EQ, Math)
{
    Math *m=new Math();
    EXPECT_EQ(3.14,m->returnPi());
}

我需要做什么?

我看了手册,但不知道如何解决这个错误。

内联函数应该在你的头文件中,而不是在你的源文件中,这样它就可以被调用者(没有访问源文件的权限)内联。

此外,如果您给出了函数的定义,则不需要在类声明中指定inline

所以你的标题应该变成:

class Math
{
public:
    Math(void);
    double returnPi() { return 3.14; } // no need to specify inline here
    ~Math(void);
};

并从源文件中删除returnPi()的定义。

注意,您还可以这样做:

class Math
{
public:
    Math(void);
    double returnPi();
    ~Math(void);
};

inline double Math::returnPi() { return 3.14; } // inline is mandatory here to avoid respecting the "One Definition Rule"

如果您希望将类声明与函数定义分开,则第二个解决方案很好。

还请注意,inline不保证实际的函数调用将被内联:它强制的唯一事情是你不必尊重"一个定义规则":inline函数必须在所有翻译单元中具有相同的定义。

您确定正在编译类的CPP文件作为项目的一部分吗?