2012-07-12 68 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; 
} 

你在做什麼不同?