我发现了一个旧的 C++ DLL,我想在我的一个项目中使用它,在 VS2015 中。
问题是,它无法编译。我与团队中最初编写代码的人取得了联系,他确信使用 VS2010 编译的代码完全相同。
我在一个非常简单的函数中出错了:
标题摘录:
/*
Data input
*/
istream* input; //Source of data
long inputpos; // Current position in the data stream
以及代码本身:
// Helper function to increment a counter while reading a character
void* Calculator::inputstream_get(char& ch)
{
++inputpos;
return input->get(ch);
}
最后,我收到错误 C2440:
'return': cannot convert from 'std::basic_istream<char,std::char_traits<char>>' to 'void *'
据我了解(我不是 C++ 专家,我不得不说...)void 指针可以表示任何类型的数据,我错了吗?
有什么方法可以将我的 istream 转换为空指针吗?
非常感谢您的帮助
最佳答案
之所以在 VS 2010 (C++03) 中编译而不是在 VS 2015 (C++11) 中编译,是因为在 C++03 中,标准库流定义了到 void*< 的隐式转换
;该转换的目的是允许测试它们的真实性(例如 while (cin >> x)
),而不允许隐式转换为 bool
(这将允许这样的怪物作为 1 + (cin >> x)
进行编译。
请注意,返回的 void*
的值未指定:当流处于失败状态时它是一个空指针,或者是一个未指定的非空指针当 stram 处于良好状态时的指针。
C++11 引入了显式转换运算符和上下文转换到 bool
的概念,这意味着这些到 void*
的“hacky”转换在标准中被替换了通过一个安全的 explicit operator bool () const
。当然,这会使代码无法编译为 C++11。
如何解决这个问题是改变 Calculator::inputstream_get
如下:
void* Calculator::inputstream_get(char& ch)
{
++inputpos;
return input->get(ch) ? this : nullptr;
}
这保留了失败时返回空指针和成功时返回未指定的非空指针的语义。
关于c++ - void指针函数的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42251175/