输出void指针功能

Max*_*ime 4 c++ pointers

我已经发现了一个旧的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'强制转换为无效指针?

非常感谢你的帮助

Rei*_*ica 6

这个在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)

这保留了在失败时返回空指针的语义,以及在成功时返回未指定的非空指针.