【发布时间】: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