转换运算符转换为 Visual Studio 2013 时遇到的问题



在Visual Studio 2005和2008下,我一直在使用简单的char缓冲区类。 我今天转换为VS 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

使用 Visual Studio 2017,只有行

t((std::string)acp);

给出编译错误。删除该强制转换,它可以编译而不会出错。

有很多方法可以修复该错误。有些可能不适用于VS 2013。

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

但强制转换通常不是一个好主意,因此向 ACP 添加方法str()可能是一个好主意。或者向需要const ACP &t添加重载。

如果可以使用支持 C++ 11 的编译器,则需要std::string &&t重载也可能有意义。

最新更新