![](/img/trans.png)
[英]Calling overriden (derived class) version of a non-virtual base class function from inside base class?
[英]Calling function that was declared virtual in interface (and implemented in derived class) inside base abstract class
我有以下 inheritance model:
interface abstract class concrete derived class
_________________________________________________________
IPriorityQueue -> APriorityQueue -> UnsortedPriorityQueue
我的成員 function 在界面中被聲明為純虛擬。 在抽象的 class 中,我想使用size()
來實現empty()
,因為如果 size = 0,則優先級隊列為空。 size()
在派生的 class 中正確實現。
#include <list>
template <typename K, typename V>
class IPriorityQueue
{
public:
virtual int size(void) const = 0;
virtual bool empty(void) const = 0;
};
template <typename K, typename V>
class APriorityQueue : virtual public IPriorityQueue<K, V>
{
public:
bool empty(void) const { return (!size()); }
};
template <typename K, typename V>
class UnsortedPriorityQueue : virtual public APriorityQueue<K, V>
{
private:
std::list<V> _list;
public:
int size(void) const { return (this->_list.size()); }
};
int main()
{
UnsortedPriorityQueue<int, char> test;
}
但是,我收到以下錯誤:
../../libft/APriorityQueue.hpp:49:37: error: there are no arguments to 'size' that depend on a template parameter, so a declaration of 'size' must be available [-fpermissive]
bool empty(void) const { return (!size()); }
^~~~
../../libft/APriorityQueue.hpp:49:37: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
我在 StackOverflow 上的其他一些答案中讀到必須指定命名空間,所以我按照以下方式對其進行了修改:
bool empty(void) const { return (!IPriorityQueue<K, V>::size()); }
但是現在我得到一個 linker 錯誤,抱怨IPriorityQueue<K, V>::size()
沒有實現:
main.o:main.cpp:(.text$_ZNK14APriorityQueueIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5emptyEv[_ZNK14APriorityQueueIiNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5emptyEv]+0x28): undefined reference to `IPriorityQueue<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::size() const'
collect2.exe: error: ld returned 1 exit status
有什么辦法可以解決這個問題嗎? 這樣的設計甚至可能嗎? 先感謝您
只需更換
bool empty(void) const { return (!size()); }
和
bool empty(void) const { return (!this->size()); }//note i have added this->
這將解決您的問題。
這是規則
編譯器在查找非依賴名稱時不查找依賴基類。
這是一篇很好的文章,可以閱讀更多相關信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.