shared_ptr<my_class>对象将不被接受为纯虚拟基类中的 myclass 方法参数

A shared_ptr<my_class> object will not be accepted as a myclass method argument in a pure virtual base class

本文关键字:虚拟 基类 myclass 参数 方法 class my lt ptr gt 对象      更新时间:2023-10-16

我正试图在纯虚拟类中声明一个方法

class myclass
{
   virtual void mymethod(const myclass_vector & arg);
   virtual void abstract_method() = 0;
};
typedef std::shared_ptr<myclass> myclass_p;
typedef std::vector<myclass_p> myclass_vector;

我无法使用C++中通常使用的方法来解决循环性问题。我得到的错误,取决于我如何前向声明类和typedef(我也尝试过将它们转换为类定义),例如,"字段myclass_vector_instance具有不完整的类型myclass_vector",还有"冲突声明’错误和链接错误。

例如,

class myclass;
typedef std::shared_ptr<myclass> myclass_p;
typedef std::vector<myclass_p> myclass_vector;
class myclass
{
   virtual void mymethod(const myclass_vector & arg);
   virtual void abstract_method() = 0;
};

不会起作用。

我的猜测是"std::shared_ptr"需要提前知道它将指向的对象的大小

有什么想法吗?

如果您已经完成了类的前向声明。您的示例应该可以工作。例如,下面的例子是工作

#include<iostream>
#include<vector>
#include <string>
#include<memory>
using namespace std;
class myclass; //forward declaration 
typedef std::shared_ptr<myclass> myclass_p;
typedef std::vector<myclass_p> myclass_vector;
class myclass
{
   virtual void mymethod(const myclass_vector & arg);
   virtual void abstract_method() = 0;
};
int main()
{
    myclass_p A;
}

请确保您已将所有标头都放好。shared_ptr是在"include"中定义的。它应该可以正常工作。请告诉我您面临的确切错误?