2017-08-01 76 views
1

我在Visual Studio 2005和2008下使用了一段簡單的char緩衝區。 我今天轉換爲VS 2013,並且在不同的場景中出現模糊的轉換錯誤。我刪除了不需要的部分代碼:轉換爲Visual Studio 2013的鑄造操作員的問題

#include <string> 

class ACP 
{ 
public: 
    ACP(const char* const init) : ourStr_(_strdup(init)), size_(strlen(init) + 1) { } 
    virtual ~ACP() { free(ourStr_); } 

    // 
    // casting operators 
    // 
    operator char*()     { return ourStr_; } 
    operator const char* const() const { return ourStr_; } 

    operator const std::string() const { return ourStr_; } 

protected: 
    // hide the default constructor 
    ACP() : ourStr_(NULL), size_(0) {} 
    // hide the copy constructor 
    ACP(const ACP& copy); 

protected: 
    char* ourStr_; 
    size_t size_; 
}; // ACP 

void t(const std::string& val) 
{ 
    std::string s = val; 
} 
void test() 
{ 
    const ACP acp("hello"); 
    std::string s = acp; 
    const std::string cs = acp; 
    t((std::string)acp); 
    t(acp); 
    char ch[50]; 
    strcpy(ch, acp); 
} 

新的衝突似乎在char *和std :: string之間的轉換運算符。 給予錯誤,像這樣:

1>foo.cpp(36): error C2440: 'initializing' : cannot convert from 'const ACP' to 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 
1>foo.cpp(37): error C2440: 'initializing' : cannot convert from 'const ACP' to 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 
1>foo.cpp(38): error C2440: 'type cast' : cannot convert from 'const ACP' to 'std::string' 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 
+0

嗨。謝謝。 所以稍微澄清一下。我知道我可以通過幾種方式「修復」所有這些都打敗了課堂的原創目的。 請注意,我也試過VS2015,它與2013年有點不同。 所以,我真正的問題是爲什麼我的代碼不再適用於較新的環境。即我只想了解原因。 我已經好好地添加了.str()函數,並且必須通過數百個文件才能使用它:-( –

回答

1

與Visual Studio 2017年,僅行

t((std::string)acp); 

給編譯錯誤。刪除該轉換並且編譯沒有錯誤。

有很多方法可以解決這個錯誤。有些人可能不工作與VS 2013

t(std::move(acp)); // C++11 
t(static_cast<const std::string &>(acp)); 

但鑄造一般不會因此增加的方法str()到ACP可能是一個好主意,好主意。或者增加一個t的超載,需要const ACP &

如果您可以使用支持C++ 11的編譯器,則t的重載需要std::string &&,這也許是有意義的。

+1

)不需要轉換運算符來返回'const std :: string'。當您返回一個副本無論如何,返回'std :: string'已經足夠,甚至可能會更加多才多藝。 – Phil1970