你好,我有哪些包括内联函数,当我尝试使用谷歌测试测试这个类时,我有错误,如:
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());
}
我需要做什么?我阅读手册,但没有看到我如何解决这个错误。
答案 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文件编译为项目的一部分吗?这应该没问题。