使用Google Test写单元测试遇“logger未定义”语法错误求助
问题分析与解决方案
你遇到的报错根源很明确:在C++类的成员声明区域,不能使用圆括号语法来初始化非静态成员变量,而你在GraphParsing测试类里写的vrk::Graph graph(logger);正好违反了这个语法规则。
为什么会这样?
C++标准之所以禁止这种写法,是为了避免编译器混淆成员变量初始化和成员函数声明。比如vrk::Graph graph(logger);会被编译器误判为:声明一个名为graph的成员函数,它返回vrk::Graph类型,参数是一个名为logger的变量(但此时logger作为成员变量还没完成声明解析,所以就会报"logger not defined"的错误)。
而你在TEST_F宏里的写法能正常运行,是因为宏内的代码属于函数作用域,局部变量的初始化完全允许使用圆括号语法,不存在歧义问题。
两种可行的解决方法
方法1:使用构造函数初始化列表
在测试类的构造函数中,通过初始化列表来完成graph的初始化,这是C++中初始化成员变量的标准方式:
class GraphParsing : public testing::Test { public: vrk::DynamicLogger& logger = vrk::DynamicLogger::GetInstance(); vrk::Graph graph; // 先声明成员变量 // 构造函数中用初始化列表初始化graph GraphParsing() : graph(logger) {} };
方法2:使用统一初始化语法(C++11及以上)
如果你的编译器支持C++11或更高版本,可以用大括号{}来完成类内成员初始化,这种写法不会和函数声明混淆:
class GraphParsing : public testing::Test { public: vrk::DynamicLogger& logger = vrk::DynamicLogger::GetInstance(); vrk::Graph graph{logger}; // 大括号初始化,合法且无歧义 };
两种方法都能解决你的问题,根据你的项目C++版本偏好选择即可。
内容的提问来源于stack exchange,提问作者venkysmarty
相关产品推荐
相关产品推荐

