C++ 无效使用非静态数据成员
C++ Invalid use of non-static data member
我想将函数作为参数传递给模板化函数,而无需任何间接寻址。为了实现这一点,我创建了两个嵌套结构,每个结构定义我希望传递给模板化函数的函数。每个结构都从外部访问数据成员class B
:
namespace A{
class B{
public:
B();
template <typename T>
void templatedFunction(T t){
//I pass one of the struct objects in to here, to invoke the desired function
t();
}
private:
struct X{
void operator(){
do();
}
void do(){
//Accesses the data members of class B
e->doSomething();
}
};
struct Y{
void operator(){
do();
}
void do(){
//Accesses the data members of class B
d.doSomething();
}
};
C* c;
D d;
E* e;
};
}
我得到的编译器错误几乎是所有格式:
错误:非静态数据成员 B::d 的使用无效
对于结构中访问类数据成员的行和在 B
中声明数据成员的行。
C++ 中的嵌套类不会(自动)访问包含类的实例。它只是一个类定义,就像任何其他类定义一样。您需要一个B
实例来访问 B
的非静态数据成员。
您可以将嵌套类Y
重构为
struct Y
{
void operator()( B& b ){
do( b );
}
void do( B& b ){
//Accesses the data members of class B
b.d.doSomething();
}
};
并相应地修复函数模板和调用以及类X
。
请注意,您为operator()
提供的代码,没有参数列表,不会编译,但我不会投反对票,因为您被另一个编译错误阻止了(即,可能是您正在显示的真实代码)。
如果你有一个结构(或类)嵌套在另一个类中,它不会以任何方式被特别处理。它的工作方式与结构在封闭类外部定义完全相同。唯一不同的是嵌套类名的范围。所以,如果你有
class A { class B{}; };
和
class B{}; class A {};
唯一的区别是,在类A
外部,您需要在第一种情况下将类B
命名为 A::B
,而在第二种情况下只需B
。没有其他区别,特别是类B
不会获得对类A
成员的任何特殊访问权限。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员