我正在尝试实现一个返回结构的函数,但是当我编译时,它总是给我错误。
在我的标题文件中:
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 :(得分: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是私有的。如果编译器不支持此类型说明符,则不可能使用函数的返回值。