2010-03-27 38 views
5

Tôi đã vượt qua một vấn đề, tôi nghĩ một điều rất cụ thể.các phương pháp ảo và các lớp mẫu

Tôi đã có 2 lớp, một B aseclass và D lớp erived (từ B aseclass). B là một mẫu lớp (hoặc lớp mẫu) và có một tinh khiết phương pháp ảovirtual void work(const T &dummy) = 0; Các D lớp erived là nghĩa vụ phải reimplement này, nhưng như D được Xuất phát từ B hơn D là một lớp mẫu khác, trình biên dịch khạc nhổ tôi rằng các hàm và mẫu ảo không hoạt động cùng một lúc.

Bất kỳ ý tưởng nào về cách thực hiện những gì tôi muốn?

Tôi thankfull cho bất kỳ suy nghĩ và ý tưởng, đặc biệt là nếu bạn allready làm việc ra rằng vấn đề

lớp này là cố định hay còn gọi là AS IS, tôi không thể chỉnh sửa này mà không phá vỡ cơ sở mã hiện

template <typename T> 
class B { 
public: 
... 
virtual void work(const T &dummy) = 0; 
.. 
}; 

mất int * là một ví dụ

class D : public B<int*>{ 
... 
virtual void work(const int* &dummy){ /* put work code here */ } 
.. 
}; 

Edit: Trình biên dịch nói với tôi, rằng void B<T>::work(const T&)[with T = int*]p ure ảo trong phạm vi D

+0

Đọc tại sao lý do vẫn không hoạt động đối với tôi (như đã thử với các lớp Qt), thiếu sót thiết kế Qt ... http://lists.trolltech.com/qt-interest/2006 -02/thread00693-0.html – drahnr

+0

và xem tại đây http://doc.trolltech.com/qq/qq15-academic.html cuối cùng tôi phải sử dụng khoảng trống cũ * thay vì mẫu ... – drahnr

Trả lời

9

Bạn đã đặt sai địa điểm. Hãy thử

virtual void work(int* const &dummy){ /* put work code here */ } 

const int* cũng giống như int const*, tức là nó liên kết const với int và không phải là con trỏ.

1

Hãy thử:

int* const& dummy 
+0

thực sự quan trọng, tôi có nghĩa là tôi đã làm nó như trên kể từ khi tôi đã học C + + và không ai phàn nàn cho đến nay ... cho đến nay ... Có một số tài liệu và thực hành tốt nhất cho const? – drahnr

+4

Đó là sự khác biệt giữa "const con trỏ đến một int" và "một con trỏ đến một const int" –

+0

Bổ sung: 'const' là ràng buộc bên trái, trừ khi bên trái là không có gì, sau đó nó liên kết với bên phải (đó là sử dụng phổ biến nhất) – drahnr

0

nào biên dịch?

g ++ 4.4 không phàn nàn về:

template <typename T> 
class B { 
public: 
virtual void work(const T &dummy) = 0; 
}; 
class D : public B<int*>{ 
virtual void work(const int* &dummy){ /* put work code here */ } 
}; 

int main(){return 0;} 

EDIT: Tất nhiên - lỗi chỉ xuất hiện khi thực sự instantiating D, cố định bằng cách di chuyển các từ khóa const:

template <typename T> 
class B { 
public: 
virtual void work(const T &dummy) = 0; 
}; 
class D : public B<int*>{ 
virtual void work(int* const &dummy){ /* put work code here */ } 
}; 

int main(){D d;return 0;} 
+2

@Douglas Vì bạn không sử dụng các mẫu. –

0

Bạn có một hỗn hợp của const và các vấn đề tham chiếu. Các bản dịch sau:

template <typename T> 
struct B { 
virtual void work(T dummy) = 0; 
}; 

struct D : public B<int*>{ 
virtual void work(int* dummy){ /* put work code here */ } 
}; 

int main() { 
    D d; 
    d.work(0); 
} 
Các vấn đề liên quan