c++ - void指针函数的输出

标签 c++ pointers

我发现了一个旧的 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/

相关文章:

将 void 指针转换为结构指针不会在结构内返回正确的指针

c - 将新的十六进制值重新分配给 Uint32 *

c - malloc 操作清除其他分配的内存

c - 从函数返回 FILE 指针并在 main 上处理它

c++模板到模板参数

c++ - 如何在 Rust 中为 ArmA 3 DLL 实现 RVExtension 函数?

c++ - 类的位宽

C++ 运算符重载混淆

C++ 对象指针静态列表和内存泄漏

c++ - 指向指针或引用的迭代器 - 错误