2013-02-10 74 views
0

比方說,我有這樣的例子模板:如何使模板中的純虛擬方法適應從其繼承的類?

template<class T> 
class Wrapper 
{ 
virtual T* ReturnPtr() = 0; 
}; 

然後我從它繼承:

class Buffer; //some class 
class BufferWrapper : public Wrapper<Buffer> 
{ 
virtual Buffer* ReturnPtr(); //<< (1.) 
} 
  1. 這是做正確的方式嗎?當我這樣寫它時,它 給我沒有intellisense錯誤,但是一旦我在某處寫了ReturnPtr() ,它告訴我「該對象具有與成員函數兼容的不是 的類型限定符」。
  2. 這是否意味着使用這種虛擬方法是不可能的?
+1

從'BufferWrapper'中的聲明中刪除'virtual'。 – 2013-02-10 19:54:57

+0

不會改變它:(可能這樣做是非法的嗎? – 2013-02-10 19:57:39

+1

你可以顯示你在哪裏調用'ReturnPtr'嗎? – 2013-02-10 19:58:55

回答

3

當您在const對象上調用非const函數時,智能感知顯示消息。我們可以看到,ReturnPtr是非常量的。您可能會看到此消息的原因通常有兩個。第一種是當你試圖調用ReturnPtrBufferWrapper類型的const對象:

const BufferWrapper bw; 
bw.ReturnPtr(); // Can't call non-const member function on const object 

二是當你的BufferWrapper對象是類的數據成員,並正在從一個const內調用它ReturnPtr該類的成員函數:

struct SomeClass 
{ 
    BufferWrapper bw; 

    void SomeClass::SomeFunc() const 
    { 
    bw.ReturnPtr(); // Cannot call non-const member function here 
    } 
} 
+0

是的,事實證明你是對的 - 問題是,我在另一個const的方法中調用了ReturnPtr。當我刪除了const從另一種方法來看,一切都很順利 – 2013-02-10 20:09:13

+0

@Bogomil你可以在你的類中添加一個'ReturnPtr'的const重載,它返回一個'const Buffer *',這樣你就可以擁有'const'-正確性和可編譯的代碼。 – 2013-02-10 20:09:55