ASSERT_TRUE()返回类型与gtest中的函数类型不匹配

时间:2012-09-27 09:07:05

标签: c++ visual-studio-2010 googletest

当我使用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.c

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
}

3 个答案:

答案 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;
}