2017-05-26 69 views
-1

我面臨着以下問題在MS的Visual Studio 2015年MSVS 2015年,C++,帶有參數的構造函數調用導致錯誤

我有一個Hotel類的重載構造函數的字符串參數。 當我嘗試創建一個使用重載,而不是默認的構造函數的對象,編譯器面臨以下錯誤:

Error C2664 'std::Hotel::Hotel(const std::Hotel &)': cannot convert argument 1 from 'const char [7]' to 'const std::Hotel &'

Hotel.h

namespace std { 
    class Hotel { 
    public: 
     string hotelName;      // Hotel's name. 

     Hotel();   // Default constructor. 
     Hotel(string);  // Overloaded constructor. 
     ~Hotel();   // Default destructor. 
    }; 

} 

Hotel.cpp

namespace std { 

    Hotel::Hotel() { // // Default constructor. 
    } 

    Hotel::Hotel(string name) { // // Overloaded constructor. 
     hotelName = name; 
    } 
} 

main.cpp

int main() { 
    Hotel Palace("Palace"); 
} 

在搜索過程中,我看到MSVS對字符串使用了兩種方法。而我找到的類似問題的解決方案是將"Palace"轉換爲Hotel Palace(_T("Palace"));

同樣的事情發生時,我嘗試從重載構造函數創建一個具有非字符串作爲參數類型的對象。

這是必須明確與MSVS,或者我做錯了什麼?

任何幫助,將不勝感激。

+3

你不應該把你自己的類放到'namespace std'中 –

+1

你爲什麼使用std命名空間?你是否需要使用命名空間? – cup

+0

還有很多其他代碼需要std命名空間標記...您認爲這是問題所在? – Diaman

回答

2

代碼中存在一些可能導致此錯誤的問題。首先,請不要使用namespace std {...}。使用

using std::string 
using std::cout 

改爲。您也可以使用using namespace std,但不建議這樣做。 Hotel(std::string)也很好。

其次,你應該在構造函數中使用explicit修改:

explicit Hotel(string); 

這樣可以防止一些意外的轉換錯誤。您應該使用Hotel(const string&)而不是Hotel(string)。這將防止不必要的臨時副本。