我对C ++相当陌生,更习惯于C和python,但是Google这次不是我的朋友。
我有一个基类,它实现了一些在2个通用类中实现的googlemock夹具(一个基类和一个从该基类派生的参数化类),以及一个使用参数化夹具的TEST_P函数。
由于参数化的夹具用于测试2个实现,因此我将夹具类和TEST_P放入了基类cpp文件(+ hpp文件)中,并将特定的参数表放入了2个特定的cpp文件中。
这就像一个魅力。
但是...现在,我们想扩展一个实现,以便它需要在通用基类中定义的函数的特定实现。对于其他实现,通用实现仍然是正确的。
所以我想要的是仅覆盖2个test-cpp文件中的1个的通用实现。
最初(无覆盖),我在hpp中具有以下内容:
class MyBaseClass : public ::testing::Test
{
protected:
// boring fixture setup stuff
virtual void test( void );
}
class MyParametrizedBaseClass:
public MyBaseClass,
public::testing::WithParmInterface< std:tr1::tuple< /* parameter definition */ > >{
protected:
// some custom assert method definitions
}
baseclass.cpp文件:
MyBaseClass::test( void )
{
cout << "This is the baseclass implementation" << std::endl;
}
...
TEST_P( MyParametrizedBaseClass, TestName )
{
test();
// other googlemock checks not needed for this question
}
在2种特定的实现中,我只有参数表:
std:tr1::tuple< /* parameter definition */ > const TableName[] = {
//table implementation
}
INSTANTIATE_TEST_CASE_P( Name, MyParameterizedBaseClass, ::testing::ValuesIn( TableName ) );
到目前为止,这仍然有效。
现在,将其命名为impl_1 ...,我们希望测试执行以下操作(由于未找到MyParameterizedBaseClass :: test的定义,因此该代码不起作用):
impl_1.cpp:
void MyParameterizedBaseClass::test( void )
{
cout << "This is the impl_1 implementation" << std::endl;
}
在看到编译器错过了MyParameterizedBaseClass :: test的定义之后,我所做的第一件事是将MyParameterizedBaseClass替换为MyBaseClass,但随后将其视为重新定义(实际上是重新定义)。
因此,接下来我用谷歌搜索并找到了“ override”关键字,并修改了MyParameterizedBaseClass定义,使其看起来像这样:
class MyParametrizedBaseClass:
public MyBaseClass,
public::testing::WithParmInterface< std:tr1::tuple< /* parameter definition */ > >{
protected:
// some custom assert method definitions
void test( void ) override;
}
但是当我这样做时,我得到了错误:
Baseclass.hpp:[行号]:错误:预期为';'在“覆盖”之前
在impl_1的特定实现中,它仍然表示MyParameterizedBaseClass中未声明任何测试函数
如果我(预先知道这是错误的),请输入“;”在建议的“覆盖”之前,我得到:错误:ISO C ++禁止无类型的“覆盖”声明
接下来,我删除了“ override”关键字并重新编译。
现在满足了编译器的要求,但是链接器在impl_2上失败了,因为那里没有MyParameterizedClass :: test的实现。
的确如此,因为我想为此使用默认的测试实现。
(要完成描述:是的,如果我还对impl_2.cpp中的MyParameterizedBaseClass进行测试,它将再次起作用)
所以我的问题是:我在做什么错?
环境:具有GCC 4.4.2的Linux(我知道还很旧,但是那是我公司拥有的版本)
最佳答案
在MyParametrizedBaseClass
中添加声明是一个不错的选择。
问题是您已使用C ++ 11功能override
并基于如下代码:
std:tr1::tuple< /* parameter definition */ >
(
tr1
)表示您正在将C ++ 03与"technical report one"一起使用,因此关键字override
是未知的。这就是编译器抱怨的原因:error: expected ';' before 'override'
因此,只需删除
override
关键字就可以了。