首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换到Visual Studio 2013的cast运算符出现问题

转换到Visual Studio 2013的cast运算符出现问题
EN

Stack Overflow用户
提问于 2017-08-02 03:41:19
回答 1查看 585关注 0票数 2

我在Visual Studio2005和2008中使用一个简单的char buffer类已经有很多年了。我今天转换到了VS2013,在不同的场景中我得到了模棱两可的转换错误。我删除了代码中不需要的部分:

代码语言:javascript
复制
#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转换操作符之间。给出这样的错误:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-08-02 09:40:45

在Visual Studio 2017中,只有行

代码语言:javascript
复制
t((std::string)acp);

给出一个编译错误。删除该强制转换后,它将正确编译。

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

代码语言:javascript
复制
t(std::move(acp));   // C++11
t(static_cast<const std::string &>(acp));

但是类型转换通常不是一个好主意,所以在ACP中添加一个方法str()可能是一个好主意。或者向接受const ACP &t添加重载。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45446385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档