来自此处的类似问题 我尝试了解决方案
class A {
...
public:
// Give read-only access to vec_A
const std::vector<DataStruct> & getVector() const {
return vec_A;
}
};
但总是得到错误:"数据结构"未在此范围内声明。 DataStruct 和 vec_A 定义在私有部分,公共部分下方,在同一类中。
拜托,有人可以帮助我吗?
问候 托马斯
我想你有类似于以下示例的代码:
#include <iostream>
struct foo {
private:
struct bar {
void barbar() { std::cout << "hello";}
};
public:
bar foobar() { return bar{}; }
};
int main() {
foo f;
foo::bar x = f.foobar();
x.barbar();
}
它有一个错误:
<source>: In function 'int main()':
<source>:13:10: error: 'struct foo::bar' is private within this context
13 | foo::bar x = f.foobar();
| ^~~
<source>:4:15: note: declared private here
4 | struct bar {
| ^~~
因为bar
在foo
是私人的.但是,这并不意味着您不能在foo
之外使用它。您可以使用auto
:
int main() {
foo f;
auto x = f.foobar();
x.barbar();
}
或decltype
:
int main() {
foo f;
using bar_alias = decltype(f.foobar());
bar_alias x = f.foobar();
x.barbar();
}
您无法访问名称DataType
但可以使用auto
并且可以获取该类型的别名。这也适用于std::vector<DataType>
,只需要更多的样板文件即可直接获得DataType
。
您正在尝试从数据类型"DataStruct"创建一个向量。你确定你写了类/或实现了它吗?它可能只是一个变量。你知道你实际上必须把一个数据类型放进去,比如int,bool,string。它定义了向量中特定变量的数据类型。
首先,返回类型声明符部分std::vector<DataStruct>
在此上下文中需要一个完整的类型。这就是该错误的含义。类定义块可以查找成员的标识符和签名,但它不能查找类型定义。
A 类在其右大括号之前不完整。连续地,定义的嵌套类在其右大括号之前是不完整的。以下声明是正确的:
class A
{
private:
struct DataStruct {
}; // a complete type
public:
// Give read-only access to vec_A
const std::vector<DataStruct> & getVector() const {
return vec_A;
}
private:
std::vector<DataStruct> vec_A;
};
在任何其他情况下,您可以转发将其声明为struct A::DataStruct
。