我已经发现了一个旧的C++ DLL,我想在VS2015的一个项目中使用它.
问题是,它没有编译.我与团队中的一个人开始联系,他们首先制作了代码,并且他确信使用VS2010编译完全相同的代码.
我在一个非常简单的函数中有一个错误:
标题摘录:
/*
Data input
*/
istream* input; //Source of data
long inputpos; // Current position in the data stream
Run Code Online (Sandbox Code Playgroud)
代码本身:
// Helper function to increment a counter while reading a character
void* Calculator::inputstream_get(char& ch)
{
++inputpos;
return input->get(ch);
}
Run Code Online (Sandbox Code Playgroud)
最后,我得到一个错误C2440:
'return': cannot convert from 'std::basic_istream<char,std::char_traits<char>>' to 'void *'
Run Code Online (Sandbox Code Playgroud)
这是我的理解(我不是C++专家,我必须说...),无效指针可以代表任何类型的数据,我错了吗?
有没有办法将我的istream'强制转换为无效指针?
非常感谢你的帮助
这个在VS 2010(C++ 03)而不是VS 2015(C++ 11)中编译的原因是在C++ 03中,标准库流定义了隐式转换为void*; 转换的目的是允许测试它们的真实性(例如while (cin >> x)),而不允许隐式转换bool(这将允许这样的怪物1 + (cin >> x)编译).
请注意,返回的值void*未指定:当流处于失败状态时,它是空指针,或者当stram处于良好状态时,它是未指定的非空指针.
C++ 11引入了显式转换运算符和上下文转换的概念bool,这意味着这些"hacky"转换void*在标准中被安全替换explicit operator bool () const.当然,这使得代码无法编译为C++ 11.
如何解决这个问题的方法Calculator::inputstream_get如下:
void* Calculator::inputstream_get(char& ch)
{
++inputpos;
return input->get(ch) ? this : nullptr;
}
Run Code Online (Sandbox Code Playgroud)
这保留了在失败时返回空指针的语义,以及在成功时返回未指定的非空指针.