我想把函数作为参数传递给模板化的函数,而不需要任何间接的指向。为了实现这一点,我创建了两个嵌套的结构,每个结构都定义了我希望传递给模板函数的函数。每个结构都从外部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中声明数据成员的行。
发布于 2014-11-24 09:52:17
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()提供的没有参数列表的代码不会编译,但我不会否决,因为您被另一个编译错误所阻止(可能是您正在显示的真正代码)。
发布于 2014-11-24 09:58:45
如果您在另一个类中嵌套了一个struct (或该类),那么它不会以任何方式专门处理。它的工作原理完全相同,就像结构是在封闭类之外定义的一样。唯一不同的是嵌套类名的范围。所以,如果你有
class A { class B{}; };和
class B{}; class A {};唯一的区别是,在类A之外,您需要将类B命名为A::B (在第一个情况下),而在第二个类中命名为B。没有其他区别,尤其是B类不能获得对类A成员的任何特殊访问。
https://stackoverflow.com/questions/27101829
复制相似问题