C++11 转换到Visual Studio 2013的cast操作员遇到问题

C++11 转换到Visual Studio 2013的cast操作员遇到问题,c++11,stdstring,typecast-operator,C++11,Stdstring,Typecast Operator,在VisualStudio2005和2008下,我已经使用一个简单的char缓冲区类很多年了。 我今天转换到VS 2013,在不同的场景中,我得到了模棱两可的转换错误。我删除了代码中不需要的部分: #include <string> class ACP { public: ACP(const char* const init) : ourStr_(_strdup(init)), size_(strlen(init) + 1) { } virtual ~ACP

在VisualStudio2005和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);
}
#包括
类机场核心计划
{
公众:
ACP(constchar*constinit):ourStr_u(strdup(init)),size_u(strlen(init)+1{}
virtual~ACP(){free(ourStr_);}
//
//铸造操作工
//
运算符char*(){return ourStr_;}
运算符const char*const()const{return ourStr_;}
运算符const std::string()const{return ourStr_;}
受保护的:
//隐藏默认构造函数
ACP():ourStr(NULL),size(0){}
//隐藏复制构造函数
机场核心计划(施工机场核心计划和副本);
受保护的:
char*ourStr;
大小\u t大小\u;
}; // 机场核心计划
void t(常量std::string和val)
{
std::string s=val;
}
无效测试()
{
康斯特机场核心计划机场核心计划(“你好”);
std::string s=acp;
const std::string cs=acp;
t((标准::字符串)acp);
t(acp);
char-ch[50];
strcpy(ch,acp);
}
新的冲突似乎出现在char*和std::string cast运算符之间。 给出这样的错误:

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
1>foo.cpp(36):错误C2440:“初始化”:无法从“const ACP”转换为“std::basic_string”
1> 没有构造函数可以采用源类型,或者构造函数重载解析不明确
1> foo.cpp(37):错误C2440:“正在初始化”:无法从“const ACP”转换为“std::basic_string”
1> 没有构造函数可以采用源类型,或者构造函数重载解析不明确
1> foo.cpp(38):错误C2440:“类型转换”:无法从“const ACP”转换为“std::string”
1> 没有构造函数可以采用源类型,或者构造函数重载解析不明确

对于Visual Studio 2017,只有

t((std::string)acp);
给出一个编译错误。删除该强制转换并编译它而不会出错

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

t(std::move(acp));   // C++11
t(static_cast<const std::string &>(acp));
t(std::move(acp));//C++11
t(静态铸造(acp));
但是强制转换通常不是一个好主意,因此向ACP添加方法
str()
可能是一个好主意。或者向
t
添加一个重载,该重载采用
const ACP&


如果您可以使用支持C++ 11的编译器,则<>代码> t>代码>的超载,它需要一个<代码>:ST::String & & & /C>可能也是有意义的。

不需要转换运算符返回<代码> const STD::String < /C>。无论如何,当您返回一个副本时,返回
std::string
就足够了,甚至可能更通用一些。谢谢所以需要澄清一下。我知道我可以用几种方法“修复”它;所有这些都违背了班级的初衷。注意,我也尝试了VS2015,它与2013年略有不同。所以,我真正的问题是为什么我的代码在更新的环境下不再工作。i、 我只想了解原因。我主动添加了.str()函数,并通过数百个文件来利用它:-(