首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASSERT_TRUE()返回类型与gtest中的函数类型不匹配

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

Stack Overflow用户
提问于 2012-09-27 17:07:05
回答 3查看 18.2K关注 0票数 9

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

abc.h

代码语言:javascript
运行
复制
#include "gtest\gtest.h"

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

abc.c

代码语言:javascript
运行
复制
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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-27 17:09:56

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

代码语言:javascript
运行
复制
void abc::fun()
{
    ASSERT_TRUE(fun1());
}

基于My compiler complains that a constructor (or destructor) cannot return a value. What's going on?,它声明(逐字):

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

代码语言:javascript
运行
复制
ASSERT_EQ(1, Foo()) << "blah blah" << foo;

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-02-18 19:21:11

ASSERT_TRUE是一个宏。展开后,它将包含如下分支:

代码语言:javascript
运行
复制
if (fun1() == false) {
   return;
}

这就是ASSERT_TRUE在失败时硬停下来的方式,但这也意味着你的方法bool abc::fun()现在有一个void返回退出路径,与它的签名冲突。

可能的修复包括不使用硬停止断言:

代码语言:javascript
运行
复制
bool abc::fun(){
    bool result = fun1();
    EXPECT_TRUE(result); //No return in expansion
                         //No hard stop!
    return result;
}

如果不需要,也可以更改方法的返回类型:

代码语言:javascript
运行
复制
void abc::fun(){
    ASSERT_TRUE(fun1()); //Hard stop on failure
}

或通过引用返回:

代码语言:javascript
运行
复制
void abc::fun(bool &outResult){
   outResult = fun1();  //return result by reference
   ASSERT_TRUE(result);
}
票数 23
EN

Stack Overflow用户

发布于 2012-09-27 17:10:15

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

ASSERT_TRUE是一个宏,它测试某些东西是否为真,它不会为你调用return。实际上,您可以在一行中有多个ASSERT_TRUE,并且(如果它们都为真),它们都将一个接一个地执行。可以将ASSERT_TRUE宏看作是一个函数调用,尽管从技术上讲它不是。

这应该是可行的:

代码语言:javascript
运行
复制
bool abc::fun()
{
   ASSERT_TRUE(fun1()); 
   return true;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12617806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档