簡體   English   中英

調用在基本抽象 class 內的接口中聲明為虛擬(並在派生類中實現)的 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM