-1

编辑:

  • 我正在使用命名空间标准
  • 我正在使用 VS10
  • 房间是一个单独的班级
  • 我已经在所有必要的文件中包含了内存头

最初的错误是我在构建之前遇到的 Intellisense 错误。构建后,我得到了更多的对接:


  • [构建前的原始 Intellisense 错误] 声明与 "std::tr1::shared_ptr<< error-type >> Option::getRoom() 不兼容
  • 'std::tr1::shared_ptr<_Ty> Option::getRoom(void)' : 重载函数的不同之处仅在于返回类型与 'std::tr1::shared_ptr Option::getRoom(void)'
  • 'Option::getRoom' : 重新定义;不同的基本类型
  • 'Option::getRoom' 使用未定义的类 'std::tr1::shared_ptr'

这些与 Option.cpp 中的这段代码有关:

shared_ptr<Room> Option::getRoom(){
    shared_ptr<Room> room(new Room);
    return room;
}

Option.hpp中对应的代码:

public:
  virtual shared_ptr<Room> getRoom();

  • 错误“RoomOption::getRoom”:覆盖虚函数返回类型不同,并且与“Option::getRoom”不协变
  • [IntelliSense] 返回类型与被覆盖的虚函数函数“Option::getRoom”的返回类型“std::tr1::shared_ptr<< error-type >>”不相同也不协变

这与 RoomOption.hpp 中的这段代码有关,它是 Option 的子类:

public:
shared_ptr<Room> getRoom();

这是我遇到问题的两个类的所有代码:

选项.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();
    virtual shared_ptr<Room> getRoom();
};

选项.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;
}

shared_ptr<Room> Option::getRoom(){
    shared_ptr<Room> room(new Room());
    return room;
    //note that this function will never be used. I'd prefer to
    //pass back a null pointer but I couldn't do that either.
}

房间选项.h:

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

class RoomOption :
    public Option
{
private:
    shared_ptr<Room> room;
public:
    RoomOption(void);
    RoomOption(int, char*, shared_ptr<Room>);
    ~RoomOption(void);
    void setRoom(shared_ptr<Room>);
    shared_ptr<Room> getRoom();
};

房间选项.cpp:

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

RoomOption::RoomOption(void)
{
}

RoomOption::RoomOption(int newID, char* newText, shared_ptr<Room> newRoom)
{
    id = newID;
    strcpy(text, newText);
    room = newRoom;
}

RoomOption::~RoomOption(void)
{
}

void RoomOption::setRoom(shared_ptr<Room> newRoom){
    room = newRoom;
}

shared_ptr<Room> RoomOption::getRoom(){
    return room;
}
4

2 回答 2

0

此代码使用 VS 2010 在 /W4 /WX 处编译没有错误:

#include <memory>

struct Room {};

class Option {
  public:
    std::shared_ptr<Room> getRoom();
};

std::shared_ptr<Room> Option::getRoom(){
    std::shared_ptr<Room> room(new Room());
    return room;
}

int main() {
  Option opt;
  std::shared_ptr<Room> room = opt.getRoom();
  return 0;
}

你在做什么不同的事情?

于 2012-07-12T19:49:45.080 回答
-1

是在 Option.hppRoom的调用中使用它的地方声明的吗?getRoom()

您是否尝试过删除()fromnew Room()以防万一您被最令人烦恼的 parse击中,可能在我们看不到的其他代码中?

于 2012-07-12T18:57:09.350 回答