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

时间:2014-11-24 09:46:32

标签: c++ class oop struct

我希望将函数作为参数传递给模板化函数,而不需要任何间接。为了实现这一点,我创建了两个嵌套结构,每个结构定义了我希望传递给模板化函数的函数。每个结构都从外部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中声明数据成员的行。

2 个答案:

答案 0 :(得分:1)

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()代码(没有参数列表)不会编译,但我不会因为您被另一个编译错误(即,可能是您的真实代码)而停止投票重新展示)。

答案 1 :(得分:-1)

如果你有一个嵌套在另一个类中的结构(或类),它不会以任何方式特殊处理。它的工作方式与在封闭类之外定义结构的方式完全相同。唯一不同的是嵌套类名的范围。所以,如果你有

class A { class B{}; };

class B{}; class A {};

唯一的区别是,在课堂A之外,您需要在第一种情况下将课程B命名为A::B,在第二种课程中只需B。没有其他区别,特别是类B无法获得对A个成员的任何特殊访问权。