【问题标题】:function returning a struct in c++?函数在c ++中返回结构?
【发布时间】:2013-12-18 21:41:31
【问题描述】:

我正在尝试实现一个返回结构的函数,但是当我编译时,它总是给我错误。

在我的头文件中:

class AcquireSaveInfo
{
private:
    typedef struct
    {
        double x,y,z;
    }resolution;
public:
       resolution AddResolutionInfo();
};

在我的 cpp 文件中:

resolution AcquireSaveInfo::AddResolutionInfo()
{
    resolution res;
    res.x = 0;
    return res;
}

错误信息:

>.\AcquireSaveInfo.cpp(200) : error C2143: syntax error : missing ';' before 'AcquireSaveInfo::AddResolutionInfo'
3>.\AcquireSaveInfo.cpp(200) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
3>.\AcquireSaveInfo.cpp(201) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
3>.\AcquireSaveInfo.cpp(201) : error C2556: 'int AcquireSaveInfo::AddResolutionInfo(void)' : overloaded function differs only by return type from 'AcquireSaveInfo::resolution AcquireSaveInfo::AddResolutionInfo(void)'
3>        c:\devolpment\commands\acquisition\runsample\runsample\AcquireSaveInfo.h(39) : see declaration of 'AcquireSaveInfo::AddResolutionInfo'
3>.\AcquireSaveInfo.cpp(201) : error C2371: 'AcquireSaveInfo::AddResolutionInfo' : redefinition; different basic types

我想知道这是什么问题?谢谢。

【问题讨论】:

  • 只是好奇,你有什么理由不通过引用传递结构吗?我不确定您的环境中是否有任何堆栈大小限制,但这样做会有所帮助。

标签: c++ function class struct


【解决方案1】:

在函数定义处resolution 是未知的。

要解决此问题,您应该将完整范围解析添加到返回类型。

AcquireSaveInfo::resolution AcquireSaveInfo::AddResolutionInfo()
{
...
}

或者,如果您的编译器符合最新的 C++11 标准,您可以使用尾随返回类型声明,在这种情况下不需要完整的范围解析。

auto AcquireSaveInfo::AddResolutionInfo() -> resolution
{
...
}

您还应该注意resolution 是私有类型,这意味着在AcquireSaveInfo 的范围之外,将无法显式声明该类型的对象以接收AddResolutionInfo 的返回值。但是,如果您再次使用符合 C++11 标准的编译器,您仍然可以使用 auto 关键字隐式声明 resolution 类型的对象。

AcquireSaveInfo a;
auto r = a.AddResolutionInfo();

【讨论】:

  • 还有auto AcquireSaveInfo::AddResolutionInfo() -> resolutionauto 没有较短的尾随类型在 C++14 中单独工作。
  • 尾随部分在 C++11 中工作。取出其中的显式类型并仅执行 auto foo() {} 在 C++14 中工作(或现在使用主要编译器)。
  • @chris 哇,我想是时候向 c++14 打个招呼了。
  • 我明白了。是的你是对的。这确实解决了问题。非常感谢!!
【解决方案2】:

AcquireSaveInfo 的末尾需要一个分号,像这样

class AcquireSaveInfo
{
private:
    typedef struct
    {
        double x,y,z;
    }resolution;
public:
       resolution AddResolutionInfo();
};

【讨论】:

    【解决方案3】:

    您已将resolution 结构声明为私有。因此,如果您尝试从公共函数中返回它,您将收到一个错误,因为您无法访问该结构。 (Example)

    您可以通过在类的公共部分声明结构或完全在类外部声明它来解决此问题。在大多数情况下,后者比将其设为子类更可取。

    【讨论】:

    • 我将结构移至公共,但它仍然给出相同的错误。
    • 如果在类中定义,则在声明其返回值时必须使用整个作用域。
    【解决方案4】:

    你犯了三个错误

    首先是您忘记在类定义的右大括号后放置分号。 第二个是您没有为函数的返回类型指定限定名称。 第三个错误是使用函数返回值的唯一方法是使用类型说明符 auto 因为类型 AcquireSaveInfo::resolution 是私有的。如果您的编译器不支持此类型说明符,则无法使用函数的返回值。

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多