2012-09-10 205 views
-1

編輯:這只是另一種情況「愚蠢&無趣的錯誤」。你已被警告:)C++繼承與模板

這是一直讓我在晚上的東西。也許有人以更高的C++知識,可以找到如何得到這個工作:

template<class T> 
class Base 
{ 
    virtual void Method (T* arg) = 0; 
}; 

class Child : public Base<MyType> 
{ 
    void Method (MyType* arg) { /*blah*/ }; 
}; 

這並不編譯(至少在VS2008並不),因爲它無法企及的兩種方法一起。

目前,我們通過在Method聲明中使用BaseType而不是MyType來解決此問題,然後在Method的Child實現中將MyType的BaseType轉換爲MyType(我們仍然需要MyType作爲基類內其他東西的模板) 。

仍然可以直接使用模板類型。

編輯: 感謝傢伙似乎修復其他錯誤(後來列出)使這一切工作。 我確實有template<class T>而不是template<T>在我原來的代碼以及公開的方法。這表明我應該在發帖前等待更長的時間。我爲此道歉。

+2

你會有非常不同的錯誤這段代碼。請張貼您的實際代碼,或者至少編譯您遇到的同樣錯誤。 – Gorpik

回答

4

這裏是編譯和工作正常完整的例子:

struct MyType 
{ 
}; 

template< class T> 
class Base 
{ 
public: 
    virtual void Method (T* arg) = 0; 
}; 

class Child : public Base<MyType> 
{ 
    public: 
    void Method (MyType* ) { /*blah*/ }; 
}; 


int main() 
{ 
    MyType a; 
    Child b; 

    b.Method(&a); 
} 
1

在第一行寫template<class T>,而不是template<T>。這將做到這一點。

2

您需要在第一類模板正確的語法:

template<typename T> // here! You can also use "class" instead of "typename". 
class Base 
{ 
    virtual void Method (T* arg) = 0; 
}; 

和你的第二個類必須是一個類模板,除非MyType是一種類型:

template <typename MyType> 
class Child : public Base<MyType> 
{ 
    void Method (MyType* arg) { /*blah*/ }; 
}; 
1

您想要的結果你需要使基類的方法公開

template<class T> class Base 
    { 
     public: // public definition is important or else it won't be overridden 
     virtual void Method (T* arg) { 
      cout << "Method in base."; 
     } 
    }; 

class Child : public Base<char> 
{ 
    void Method (char* arg) { 
     cout << "Method in child."; 
    }; 
};