繁体   English   中英

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

对于struct中访问类数据成员的行以及在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()提供的代码operator()不带参数列表)将不会进行编译,但是我不会拒绝投票,因为您因另一个编译错误而停止运行(即,可能是您正在显示的实际代码)。

如果您在另一个类中嵌套了一个结构(或与此相关的类),则不会以任何方式对其进行特殊处理。 它的工作原理与在封闭类外部定义该结构完全相同。 唯一不同的是嵌套类名称的范围。 所以,如果你有

class A { class B{}; };

class B{}; class A {};

唯一的区别是,在类A外部,您需要在第一种情况下将类B命名为A::B ,而在第二种情况下仅将B命名为B 没有其他区别,特别是B类对A类成员没有任何特殊访问权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM