函数在c ++中返回一个结构?

时间:2013-12-18 21:41:31

标签: c++ function class struct

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

在我的标题文件中:

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

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

4 个答案:

答案 0 :(得分:4)

在函数定义resolution处不知道。

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

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

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

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

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

auto

答案 1 :(得分:1)

你需要在AcquireSaveInfo的末尾加一个分号,就像这样

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

答案 2 :(得分:1)

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

你可以通过在类的公共部分声明结构,或者在类之外完全声明它来解决这个问题。在大多数情况下,后者更倾向于使其成为一个子类。

答案 3 :(得分:0)

你犯了三个错误

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