2012-07-12 70 views
-1

编辑:C++ - 方法不兼容的宣言

  • 我使用空间std
  • 我使用VS10
  • 室是一个单独的类
  • 我已经包括在所述存储器中头所有必需的文件

原始错误是我在构建之前得到的Intellisense错误。建成后,我得到了一个更buttload:


  • [原智能感知错误之前建设]声明是“的std :: TR1 :: shared_ptr的< <错误类型>>选项不兼容:: getRoom( )
  • 'std :: tr1 :: shared_ptr < _Ty> Option :: getRoom(void)':重载函数仅与返回类型不同,返回类型为'std :: tr1 :: shared_ptr选项:: getRoom(void)'
  • 'Option :: getRoom':重新定义;不同的基本类型
  • '选项:: 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':重写虚函数返回类型不同并且不covaria nt from'Option :: getRoom'
  • [智能感知]返回类型与返回类型“std :: tr1 :: shared_ptr < <错误类型>>”被重写的虚拟函数函数“不相同也不协变”。 getRoom”

这与这段代码在RoomOption.hpp,选项的子类:

public: 
shared_ptr<Room> getRoom(); 

这里是所有的代码,我遇到问题的两个班:

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

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; 
} 

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. 
} 

RoomOption.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(); 
}; 

RoomOption。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; 
} 
+1

你是否在任何地方使用'namespace std;'或其他'using'声明? – 2012-07-12 18:51:55

+0

我无法重现这个问题,你能发布一个完整的样本来重现问题吗?你使用哪个版本的VS? – ctor 2012-07-12 18:52:30

+0

在'Option'类中声明'Room'类型?然后你需要在你的.cpp文件中写入'shared_ptr

回答

-1

在那里它在Option.hpp的getRoom()调用中使用的点声明Room

您是否尝试过从new Room()中删除()以防万一您遭到most vexing parse的攻击,可能在其他代码中我们看不到?

0

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

#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; 
} 

你在做什么不同?