2014-11-24 40 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

相關問題