在基础抽象 class 中调用在接口中声明为虚拟的函数(并在派生 class 中实现)
Calling function that was declared virtual in interface (and implemented in derived class) inside base abstract class
我有以下继承模型:
interface abstract class concrete derived class
_________________________________________________________
IPriorityQueue -> APriorityQueue -> UnsortedPriorityQueue
我的成员函数在接口中声明为纯虚函数。在摘要 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)
我在 Whosebug 上的一些其他答案中读到必须指定命名空间,因此我按以下方式对其进行了修改:
bool empty(void) const { return (!IPriorityQueue<K, V>::size()); }
但现在我收到链接器错误,抱怨 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->
这将解决您的问题。
这是规则
the compiler does not look in dependent base classes when looking up nondependent names .
Here's 一篇很好的文章,可以阅读更多相关信息。
我有以下继承模型:
interface abstract class concrete derived class
_________________________________________________________
IPriorityQueue -> APriorityQueue -> UnsortedPriorityQueue
我的成员函数在接口中声明为纯虚函数。在摘要 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)
我在 Whosebug 上的一些其他答案中读到必须指定命名空间,因此我按以下方式对其进行了修改:
bool empty(void) const { return (!IPriorityQueue<K, V>::size()); }
但现在我收到链接器错误,抱怨 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->
这将解决您的问题。
这是规则
the compiler does not look in dependent base classes when looking up nondependent names .
Here's 一篇很好的文章,可以阅读更多相关信息。