Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++与“共享类模板”错误_C++_Templates_Shared Ptr - Fatal编程技术网

C++与“共享类模板”错误

C++与“共享类模板”错误,c++,templates,shared-ptr,C++,Templates,Shared Ptr,我有一个教室,里面有一个共享的PTR向量,可以选择如下对象: private: vector<shared_ptr<Option> > options; 但由于某些原因,在构建时,我会出现以下错误: “shared_ptr”:非专用类模板不能用作模板参数“_Ty”的模板参数,应为实类型 'std::tr1::shared_ptr':使用类模板需要模板参数列表 奇怪的是,我还有一个共享的ptr向量,语法完全相同,但这个向量没有问题 还有很多地方会出现错误“Option”:

我有一个教室,里面有一个共享的PTR向量,可以选择如下对象:

private:
vector<shared_ptr<Option> > options;
但由于某些原因,在构建时,我会出现以下错误:

“shared_ptr”:非专用类模板不能用作模板参数“_Ty”的模板参数,应为实类型 'std::tr1::shared_ptr':使用类模板需要模板参数列表 奇怪的是,我还有一个共享的ptr向量,语法完全相同,但这个向量没有问题

还有很多地方会出现错误“Option”:未声明的标识符,这让我想到Option类可能有问题,但似乎没问题。以下是选项的代码:

备选案文h:

#pragma once
#include "Room.h"
#include <memory>

using namespace std;

class Option
{
protected:
    int id;
    char* text;

public:
    Option(void);
    Option(int, char*);
    virtual ~Option(void);
    char* getText();
    int getID();
};
Option.cpp:

#include "Option.h"
#include "Room.h"
#include <memory>
using namespace std;

Option::Option(void)
{
}

Option::Option(int newID, char* newText){
    id = newID;
    text = newText;
}

Option::~Option(void)
{
}

char* Option::getText(){
    return text;
}

int Option::getID(){
    return id;
}
你几乎做对了:

vector<shared_ptr<Option> >
这两个>字符在触摸时会导致出现奇怪的错误。它被解释为>>运算符

顺便说一句,感谢您将代码按原样发布,而不是将其重新输入并可能隐藏错误

你几乎做对了:

vector<shared_ptr<Option> >
这两个>字符在触摸时会导致出现奇怪的错误。它被解释为>>运算符


顺便说一句,感谢您按原样发布代码,而不是将其重新输入并可能隐藏错误。

由于您尚未发布Room类的代码,因此此答案中存在一些猜测。我假设这个代码

private:
vector<shared_ptr<Option> > options;
在房间里。Option.h文件包括Room.h,因此在Option类之前声明Room类。因此,当编译Room类的析构函数并且shared_ptr实现尝试删除Option对象时,Option是不完整的类型

从上面的代码中,我不明白为什么Option.h需要包含Room.h,事实上,它应该是另一种方式。如果确实需要包含该文件,您应该能够通过在Room.cpp中显式声明Room::~Room out-line来解决该问题

编辑:
结果是~shared_ptr。然而,shared_ptr T*和shared_ptr::reset T*确实存在问题,而问题可能是因为向量上的某些操作调用了其中一个函数,而前者更可能是前者。

由于您尚未发布Room类的代码,因此在这个答案中存在一些猜测。我假设这个代码

private:
vector<shared_ptr<Option> > options;
在房间里。Option.h文件包括Room.h,因此在Option类之前声明Room类。因此,当编译Room类的析构函数并且shared_ptr实现尝试删除Option对象时,Option是不完整的类型

从上面的代码中,我不明白为什么Option.h需要包含Room.h,事实上,它应该是另一种方式。如果确实需要包含该文件,您应该能够通过在Room.cpp中显式声明Room::~Room out-line来解决该问题

编辑:
结果是~shared_ptr。但是,shared_ptr T*和shared_ptr::reset T*确实存在问题,问题可能是因为向量上的某些操作调用了其中一个函数,而前者更可能调用。

Doh!谢谢修正了,但我还是有同样的问题。奇怪的是,我还有一个指向Item对象的共享ptr向量,语法相同,但使用Item而不是Object,这个向量很好用。。。还有,谢谢你这么好!谢谢修正了,但我还是有同样的问题。奇怪的是,我还有一个指向Item对象的共享ptr向量,语法相同,但使用Item而不是Object,这个向量很好用。。。另外,谢谢你这么好^ ^你试过矢量选项吗?你试过矢量选项吗?哦,我明白了,这很有道理。我确实需要选择ro参考室,因为我有虚拟共享的\u ptr getRoom;也是,它在子类RoomOption中被重写。我已经声明了房间析构函数,但它显然没有修复它…我找到了一种在选项中引用房间的方法,使用int-ID而不是对房间的实际引用。如果你有什么见解的话,我仍然想知道为什么析构函数没有按照你建议的方式工作。@JeanFinley我错误地认为备用析构函数要求t是一个完整类型。但是,如该链接所示,shared_ptr T*和shared_ptr::reset T*都要求T是完整类型。因此,请尝试注释Room的成员函数中的代码,这些函数可能会调用其中一个函数。请记住,因为您有一个向量,所以任何变异向量的操作也可能是罪魁祸首。@JeanFinley,Option.h不需要包括Room.h,因为虚拟共享的\u ptr getRoom;成员函数已在中声明,只需将Room类向前声明为class Room;而不是包括标题。Option.cpp可能需要包含Room.h,但这没关系,因为从标题中删除它,您就摆脱了循环依赖关系。我注释了Room中与Option有关的所有内容,除了向量本身,它仍然不起作用。
我现在就把房间的密码挂起来哦,我明白了,这是有道理的。我确实需要选择ro参考室,因为我有虚拟共享的\u ptr getRoom;也是,它在子类RoomOption中被重写。我已经声明了房间析构函数,但它显然没有修复它…我找到了一种在选项中引用房间的方法,使用int-ID而不是对房间的实际引用。如果你有什么见解的话,我仍然想知道为什么析构函数没有按照你建议的方式工作。@JeanFinley我错误地认为备用析构函数要求t是一个完整类型。但是,如该链接所示,shared_ptr T*和shared_ptr::reset T*都要求T是完整类型。因此,请尝试注释Room的成员函数中的代码,这些函数可能会调用其中一个函数。请记住,因为您有一个向量,所以任何变异向量的操作也可能是罪魁祸首。@JeanFinley,Option.h不需要包括Room.h,因为虚拟共享的\u ptr getRoom;成员函数已在中声明,只需将Room类向前声明为class Room;而不是包括标题。Option.cpp可能需要包含Room.h,但这没关系,因为从标题中删除它,您就摆脱了循环依赖关系。我注释了Room中与Option有关的所有内容,除了向量本身,它仍然不起作用。我现在就把房间的密码挂起来