2013-11-28 53 views
2

我對C++中的模板有理論上的疑問。
比方說,我有以下代碼:C++模板指向成員

Code

struct C{ 
    int val = 15; 
}; 

struct B{ 
    C c; 
    int k = 9; 
}; 

struct A{ 
    template<typename T, typename FType, FType T::* Field = nullptr> 
    void test(T& d){ 
     if (Field != nullptr){ 
      int a = d.*Field; 
     } 
    } 
}; 


int main(int argc, char *argv[]) 
{ 

    A a; 
    B be; 

    a.test<B, int, &B::c::val>(be); 
    //a.test<B, int, &B::k>(be); 
} 

的問題是:爲什麼我不能訪問到B ::Ç:: VAL場,當我可以訪問乙:: k
B :: c :: val也是B的成員。或不?

+0

int val = 15;這錯誤裏面的structre ...使用構造函數有初始值。 – Nik

+0

有沒有這樣的事情'B :: c :: val'。你只能在'::'的左邊有一個類或命名空間的名字。 'B :: c'既不是。這與模板無關。 –

+1

這會工作「a.test (be.c)」 – Nik

回答

1

B::cB成員,C::valC成員,但有沒有像B::c::val

什麼你是想在這裏做可以這樣實現:

struct A { 
    template<typename T, typename OType, typename IType, OType T::* OField = nullptr, IType OType::* IField = nullptr> 
    void test(T& d){ 
    if (OField != nullptr && IField != nullptr) { 
     auto a = d.*OField.*IField; 
    } 
    } 
}; 

int main(int argc, char *argv[]) 
{ 

    A a; 
    B be; 

    a.test<B, C, int, &B::c, &C::val>(be); 
} 

http://coliru.stacked-crooked.com/a/f89b96274218e223

當然,您可以提供成員指針作爲函數參數,並讓編譯器推導出類型參數rs爲你。