Nick X Tsui
Nick X Tsui

Reputation: 2912

function returning a struct in c++?

I am trying to implement a function that returns a struct, but when I compile, it always gives me error.

In my header file:

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

in my cpp file:

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

The error messages:

>.\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

I am wondering what is the problem with this? Thanks.

Upvotes: 0

Views: 213

Answers (4)

brunocodutra
brunocodutra

Reputation: 2349

At the point of the function definition resolution is not known.

To overcome this issue, you should add the full scope resolution to the return type.

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

Alternatively, if your compiler complies to the newest C++11 standard, you could use the trailing return type declaration, for which case the full scope resolution is not required.

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

You should also note resolution is a private type, that means outside the scope of AcquireSaveInfo, it will not be possible to explicitly declare an object of that type to receive the return value of AddResolutionInfo. If, however, you are again using a compiler complying to the C++11 standard, you could still implicitly declare an object of type resolution using the auto keyword.

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

Upvotes: 4

Vlad from Moscow
Vlad from Moscow

Reputation: 310930

You made three mistakes

The first is that you forgot to place a semicolon after the closing brace of the class definition. The second is that you did not specify qualified name for the return type of the function. And the third error is that the only way to use return value of the function is to use type specifier auto because type AcquireSaveInfo::resolution is private. If your compiler does not support this type specifier then there is no possibility to use the return value of the function.

Upvotes: 0

Zac Howland
Zac Howland

Reputation: 15872

You have the resolution structure declared as private. Thus, if you attempt to return it from a public function, you will get an error because you cannot access the struct. (Example)

You can get around this by either declaring the struct in the public section of the class, or declare it outside the class entirely. In most cases, the latter would be preferred to making it a sub-class.

Upvotes: 1

Paladine
Paladine

Reputation: 523

You need a semicolon at the end of AcquireSaveInfo, like so

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

Upvotes: 1

Related Questions