2014-11-24 102 views
1

我希望将函数作为参数传递给模板化函数,而没有任何间接性。为了实现这个,我创建了两个嵌套的结构体,每个都定义了我希望传递给模板化函数的函数。每个结构由外class B访问数据成员:C++非静态数据成员的无效使用

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; 
    }; 
} 

和编译器错误,我得到的是几乎所有的格式:

error: invalid use of non-static data member B::d

用于访问类的数据结构中的行成员和在B中声明数据成员的行。

+0

不应该像这样在模板函数中调用函数:'t()'? – 2014-11-24 09:50:48

+0

感谢 - 必须从头开始输入代码。 – user997112 2014-11-24 09:53:27

+0

回滚最新的编辑,因为它使已发布的anaswer失效。 **不要那样做**。请在答案发布后不要更改代码或问题。 – 2014-11-24 10:04:28

回答

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(),没有参数列表,但不会进行编译,但由于您被另一个编译错误阻止(即,它可能是您显示的真实代码) 。

+0

真的没有其他解决方案比传递B的实例吗? – user997112 2014-11-24 10:03:58

+0

我明白为什么我会遇到编译器错误访问结构中的成员。我不明白为什么这会导致B内变量声明的行编译器错误? – user997112 2014-11-24 10:09:14

+0

@ user997112:那么任何“不可能”的一揽子声明迟早会被反驳,无论主题如何,所以我不会这么说。但我现在无法想到任何其他实用的解决方案。当考虑到更多的问题背景时,可能会很明显,但不幸的是,背景没有具体说明。 – 2014-11-24 10:10:55

-1

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

class A { class B{}; }; 

class B{}; class A {}; 

唯一的区别是,课外A您需要命名类B在第一种情况下A::B,而在第二类中添加B。没有其他区别,特别是B类别不会获得任何特殊访问类别A成员。

+0

那么我如何从B(第一种情况)访问A的成员? – user997112 2014-11-24 10:00:59

+0

** - 1 **“特别是B类没有获得A类成员的任何特殊通道” – 2014-11-24 10:01:56

+0

与第二种情况下的处理方式相同。您需要将引用传递给'B'的成员函数'A'。 – 2014-11-24 10:02:39

相关问题