C++ 无效使用非静态数据成员

C++ Invalid use of non-static data member

本文关键字:静态 数据成员 无效 C++      更新时间:2023-10-16

我想将函数作为参数传递给模板化函数,而无需任何间接寻址。为了实现这一点,我创建了两个嵌套结构,每个结构定义我希望传递给模板化函数的函数。每个结构都从外部访问数据成员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成员的任何特殊访问权限。