【问题标题】:Trouble with cast operators converting to Visual Studio 2013转换为 Visual Studio 2013 的转换运算符出现问题
【发布时间】:2017-08-01 19:41:19
【问题描述】:

多年来,我一直在 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

【问题讨论】:

  • 嗨。谢谢。所以稍微澄清一下。我知道我可以通过多种方式“修复”它;所有这些都违背了课程的最初目的。请注意,我也尝试了 VS2015,它与 2013 年略有不同。所以,我真正的问题是为什么我的代码不再在较新的环境下工作。即我只想了解原因。我已经好战地添加了 .str() 函数,并且必须通过数百个文件才能使用它:-(

标签: c++11 stdstring typecast-operator


【解决方案1】:

使用 Visual Studio 2017,只需一行

t((std::string)acp);

给出一个编译错误。删除该演员表并编译没有错误。

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

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

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

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

【讨论】:

  • 转换运算符不需要返回const std::string。无论如何,当您返回副本时,返回 std::string 就足够了,甚至可能更通用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多