内联函数的gtest问题

时间:2011-04-29 14:13:38

标签: c++ visual-studio googletest

你好,我有哪些包括内联函数,当我尝试使用谷歌测试测试这个类时,我有错误,如:

 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)

例如我的类(头文件)

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

我的班级(cpp文件)

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

我需要做什么?我阅读手册,但没有看到我如何解决这个错误。

2 个答案:

答案 0 :(得分:3)

内联函数应该在头文件中,而不是在源文件中,因此调用者实际上可以内联它(无法访问源文件)。

此外,如果给出函数的定义,则不需要在类声明中指定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函数必须在所有翻译单元中具有相同的定义。

答案 1 :(得分:0)

您确定要将课程'CPP文件编译为项目的一部分吗?这应该没问题。