9

当我使用ASSERT_TRUE()提供的时,Gtest我遇到了以下错误。 return type does not match function type中带有下划线VS 2010.

abc.h

#include "gtest\gtest.h"

class abc {
pubilc:
    bool fun();
    private:
    bool fun1();
};

ABC

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
}
4

3 回答 3

23

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);
}
于 2015-02-18T11:21:10.630 回答
1

中没有return指定语句,fun()但它返回一个bool. 添加return false;or或return true;fun()其返回类型更改为void

void abc::fun()
{
    ASSERT_TRUE(fun1());
}

基于我的编译器抱怨构造函数(或析构函数)无法返回值。这是怎么回事?其中指出(逐字):

由于 C++ 的特殊性,为了支持将消息流式传输到 ASSERT_* 的语法,例如

ASSERT_EQ(1, Foo()) << "blah blah" << foo;

我们不得不放弃在构造函数和析构函数中使用 ASSERT* 和 FAIL*(但不是 EXPECT* 和 ADD_FAILURE*)。解决方法是将构造函数/析构函数的内容移动到私有 void 成员函数,或者如果可行,则切换到 EXPECT_*()。用户指南中的本节对此进行了解释。

return类型必须void在使用ASSERT_*()宏的函数中。

于 2012-09-27T09:09:56.057 回答
-1

fun方法有一个bool返回类型,所以它仍然需要return一些东西。

ASSERT_TRUE是一个测试某事是否真实的宏,它不会为您调用 return。实际上,您可以ASSERT_TRUE连续执行多个,并且(如果它们都是真实的)它们将一个接一个地执行。把ASSERT_TRUE宏想象成一个函数调用,即使它不是技术上的。

这应该有效:

bool abc::fun()
{
   ASSERT_TRUE(fun1()); 
   return true;
}
于 2012-09-27T09:10:14.920 回答