2015-06-20 46 views
1

我正在使用單例設計模式(我無法使用複製構造函數)。在地圖中插入std :: string和共享指針對象

我有一個:

  • Obj.hpp和Obj.cpp文件
  • House.hpp和House.cpp文件

obj的類包含地圖房子,在那裏我可以使用字符串搜索房子。 我甚至不能編譯我Obj.cpp文件,不知道爲什麼... :(

的錯誤是:

錯誤C2676:二進制「<」:「常量性病::字符串」不定義這種 操作或轉換到類型接受的預定義的操作者

[Obj.hpp文件]

#include "house.hpp" 

class Obj 
{ 
public: 
    Obj(); 
    virtual ~Obj(); 
private: 
    Obj(const Obj& copy); 
    Obj& operator=(const Obj& assign); 

    typedef std::map<const std::string, std::shared_ptr<House> > myHouseMap; 

    myHouseMap _myHouseMap; 

    void InitObj(); 
} 

[Obj.cpp文件]

#include <map.h> 
#include <string.h> 
#include "Obj.hpp" 

Obj::Obj() 
{ 
    InitObj(); 
} 

void Obj::InitObj() 
{ 
    /* ERROR ON THIS LINE BELLOW */ 
    _myHouseMap.insert(std::pair<const std::string, std::shared_ptr<House>>("apartment", new House("apartment"))); 

} 

[House.hpp文件]

class House 
{ 
public: 

    House(const char* name); 
    virtual ~House(); 

private: 
    House(const House& copy); 
    House& operator=(const House& assign); 
}; 
+0

該行看起來很好,除非你的編譯器不是100%C++ 11,在這種情況下,它可能需要兩個>>之間的空格。 – Eelke

+0

哦,你的包括應該是沒有.h – Eelke

+0

你的密鑰類型不應該是'const'。 –

回答

1

不知道你是使用Visual Studio的版本,但至少視覺Studio 2013似乎很好用:

#include <map> 
#include <string> 
#include <memory> 

class House 
{ 
public: 

    House(const char* name); 
    virtual ~House(); 

private: 
    House(const House& copy) 
    { 
    } 
    House& operator=(const House& assign) 
    { 
    } 
}; 

class Obj 
{ 
public: 
    Obj() 
    { 
     InitObj(); 
    } 
    virtual ~Obj(); 
private: 
    Obj(const Obj& copy); 
    Obj& operator=(const Obj& assign); 

    typedef std::map<const std::string, std::shared_ptr<House> > myHouseMap; 

    myHouseMap _myHouseMap; 

    void InitObj() 
    { 
     // Use std::make_shared to create a new std::shared_ptr 
     _myHouseMap.insert(std::pair<const std::string, std::shared_ptr<House>>("apartment", std::make_shared<House>("apartment"))); 
    } 
}; 

問題是對構造函數期望std::shared_ptr不是原始指針。

+0

謝謝大家:)確實是shared_ptr和raw指針之間的混淆! :) – waas1919

+0

@ waas1919我可以理解,因爲'std :: shared_ptr'具有一個構造函數,它需要一個原始指針,但是'std :: pair'構造函數需要該對的實際類型。 –