2016-01-21 45 views
0

我試圖理解爲什麼(使用gcc 4.8.2)以下代碼不能編譯:調用模板函數成員時,它的名字叫同一個名字

struct A { 
    template <typename T> 
    T f() {return T(0);} 
}; 

struct B : A { 
    using MyT = int; 
    MyT f() {return (A *)this->template f<MyT>();} 
}; 

int main() 
{ 
    B b; 
    std::cout << b.f() << std::endl; 
    return 0; 
} 

如果我改變從f名稱在基地f1,那麼下面編譯就好:

struct A { 
    template <typename T> 
    T f1() {return T(0);} 
}; 

struct B : A { 
    using MyT = int; 
    MyT f() {return this->template f1<MyT>();} 
}; 
+0

運算符優先級。 –

+0

要擴展@ T.C.的評論:'return static_cast (this) - > template f ();' –

回答

3

只是因爲運營商precendence,你是鑄造f功能的結果A*,而不是投thisA*,實際上使用static_cast更好。

MyT f() {return static_cast<A*>(this)->f<MyT>();} 

這將工作。並且您還隱藏名稱,您只需執行以下操作:

struct B : A { 
    using MyT = int; 
    using A::f; 
    MyT f() {return this->f<MyT>();} 
}; 
+0

謝謝!在最後一部分中,即使沒有'this->'也可以工作。 – AlwaysLearning

+0

嗯...第二個建議不適用於我的實際代碼。調用'static_cast (this) - > template後繼者()'可以工作,但調用'後繼者()'不會有'使用Base ::後繼者'... – AlwaysLearning

相關問題