2017-08-01 98 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