当我使用ASSERT_TRUE()
中提供的Gtest
时,我遇到了错误。
return type does not match function type
中带有下划线的VS 2010.
。
#include "gtest\gtest.h"
class abc {
pubilc:
bool fun();
private:
bool fun1();
};
bool abc::fun()
{
ASSERT_TRUE(fun1()); // Getting error: return type does not match function type
}
bool abc::fun1()
{
return true; // True or false depanding on operation
}
答案 0 :(得分:17)
ASSERT_TRUE
是一个宏。展开时,它将包含一个分支,如:
if (fun1() == false) {
return;
}
这就是ASSERT_TRUE
在失败时难以停止的方式,但这也意味着您的方法bool abc::fun()
现在有一个void
返回退出路径,与其签名相冲突。
可能的修复包括不要使用硬停止断言:
bool abc::fun(){
bool result = fun1();
EXPECT_TRUE(result); //No return in expansion
//No hard stop!
return result;
}
或在不需要时更改您的方法返回类型:
void abc::fun(){
ASSERT_TRUE(fun1()); //Hard stop on failure
}
或通过引用返回:
void abc::fun(bool &outResult){
outResult = fun1(); //return result by reference
ASSERT_TRUE(result);
}
答案 1 :(得分:3)
return
中没有指定fun()
语句,但它返回bool
。将return false;
或return true;
添加到fun()
或将其返回类型更改为void
:
void abc::fun()
{
ASSERT_TRUE(fun1());
}
基于My compiler complains that a constructor (or destructor) cannot return a value. What's going on?陈述(逐字):
由于C ++的特殊性,为了支持将消息流式传输到ASSERT_ *的语法,例如,
ASSERT_EQ(1, Foo()) << "blah blah" << foo;
我们不得不在构造函数和析构函数中放弃使用ASSERT *和FAIL *(但不是EXPECT *和ADD_FAILURE *)。解决方法是将构造函数/析构函数的内容移动到私有void成员函数,或者如果可行则切换到EXPECT _ *()。用户指南中的这一部分对其进行了解释。
return
类型在使用void
宏的函数中必须为ASSERT_*()
。
答案 2 :(得分:1)
fun
方法的返回类型为bool
,因此仍然需要return
。
ASSERT_TRUE
是一个测试某些事情是真的宏,它不会为你调用return。实际上,你可以连续多个ASSERT_TRUE
,并且(假设它们都是真的)它们将一个接一个地执行。将ASSERT_TRUE
宏视为函数调用,即使它不是技术上的。
这应该有效:
bool abc::fun()
{
ASSERT_TRUE(fun1());
return true;
}