2013-12-18 4 views
0

Я пытаюсь реализовать функцию, которая возвращает структуру, но когда я компилирую, она всегда дает мне ошибку.функция, возвращающая структуру в C++?

В моем файле заголовка:

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 

Мне интересно, что проблема с этим? Благодарю.

+0

Просто любопытно, есть ли какая-либо причина, по которой вы не могли бы передать структуру по ссылке? Я не уверен, что у вас есть ограничения размера стека в вашей среде, но это поможет. – cowboydan

ответ

4

В точке определения функции resolution не известно.

Чтобы преодолеть эту проблему, вы должны добавить полное разрешение области к типу возврата.

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

В качестве альтернативы, если ваш компилятор соответствует до последнего стандарта C++ 11, вы можете использовать трейлинг декларацию типа возвращаемого значения, для которых случая полного разрешение области видимости не требуется.

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

Следует также отметить resolution частный тип, это означает, что вне сферы AcquireSaveInfo, это будет невозможно явно объявить объект этого типа, чтобы получить возвращаемое значение AddResolutionInfo. Если, однако, вы снова используете компилятор, соответствующий стандарту C++ 11, вы все равно можете объявить объект типа resolution с использованием ключевого слова auto.

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

Также 'auto AcquireSaveInfo :: AddResolutionInfo() -> resolution'. 'auto' без более короткого трейлинг-типа работает сам по себе в C++ 14. – chris

+0

@chris вы правы, ведь уже с C++ 11. – brunocodutra

+0

Задняя часть работает на C++ 11. Вывод явного типа в этом и просто выполнение 'auto foo() {}' работает в C++ 14 (или теперь с основными компиляторами). – chris

1

Вам нужна точка с запятой в конце AcquireSaveInfo, как так

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

Вы сделали три ошибки

Первое, что вы забыли поставить точку с запятой после закрывающей скобки определения класса. Во-вторых, вы не указали квалифицированное имя для возвращаемого типа функции. И третья ошибка заключается в том, что единственным способом использования возвращаемого значения функции является использование автоматического определения типа auto, поскольку тип AcquireSaveInfo :: resolution является закрытым. Если ваш компилятор не поддерживает этот спецификатор типа, тогда нет возможности использовать возвращаемое значение функции.

1

У вас есть структура resolution, объявленная как частная. Таким образом, если вы попытаетесь вернуть его из публичной функции, вы получите сообщение об ошибке, потому что вы не можете получить доступ к структуре. (Example)

Вы можете обойти это, объявив структуру в общедоступной части класса или объявив ее вне класса целиком. В большинстве случаев последнее предпочло бы сделать его подклассом.

+0

Я перемещаю структуру публично, но она по-прежнему дает ту же ошибку. –

+0

Если он определен внутри класса, вы должны использовать всю область при объявлении возвращаемого значения. –

Смежные вопросы