2011-02-11 48 views
1

這段代碼產生的GNU編譯器錯誤:是否有模板基類繼承的另一個解決方法?

class A 
{ 
public: 
    int X; 
}; 

template<class T> 
class Foo : public T 
{ 
public: 
    void doStuff(); 
}; 

template<class T> 
void Foo<T>::doStuff() 
{ 
    X++; 
} 

已經有an answer爲什麼這是一個錯誤。我想知道是否有另一種解決此錯誤的方法,而不是使用

T::X 

每次我想引用X成員。我嘗試這樣做:

template<class T> 
void Foo<T>::doStuff() 
{ 
    using T::X; 
    X++; 
} 

但GCC提供了一個錯誤:「一類的標準名稱是不允許的」

+0

顯然你不能`在函數內部使用T :: X;`。你需要這樣做,如下所示:http://www.ideone.com/MI9fM ...查看我的答案其他選擇。他們不如此,但有時候意識到他們有幫助! – Nawaz 2011-02-11 21:42:16

回答

3

這也將工作:

this->X++; 

這將告訴編譯器從1995年起它認爲X不是派生類的成員,它必須來自模板庫,並且不需要擔心它。

1
class A 
{ 
public: 
    int X; 
}; 

template<class T> 
class Foo : public T 
{ 
public: 
    using T::X; 
    void doStuff(); 
}; 

template<class T> 
void Foo<T>::doStuff() 
{ 
    X++; 
} 

int main() 
{ 
    Foo<A> o; 
    o.doStuff(); 
} 
+0

這就是我所缺少的東西,我將do :: use :: T :: X放在doStuff()函數中,而不是類聲明中。 – camomilk 2011-02-11 21:32:32

0

也許這會工作?只是猜測:

int &X = T::X; 

這將創建一個可以在代碼塊中使用別名,你試過using T::X沒有工作類似。