输出void指针功能

时间:2017-02-15 13:47:53

标签: 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 ++专家,我必须说...),无效指针可以表示任何类型的数据,我错了吗?

有没有办法将我的istream'强制转换为无效指针?

非常感谢你的帮助

3 个答案:

答案 0 :(得分:6)

在VS 2010(C ++ 03)而不是VS 2015(C ++ 11)中编译的原因是在C ++ 03中,标准库流定义了隐式转换为void*;转换的目的是允许测试它们的真实性(例如while (cin >> x)),而不允许隐式转换为bool(这将允许1 + (cin >> x)这样的怪物编译)。

请注意,返回的void*未指定:当流处于失败状态时,它是空指针,或者当stram&时,它是未指定的非空指针#39;状态良好。

C ++ 11引入了显式转换运算符和上下文转换为bool的概念,这意味着这些&#34; hacky&#34;标准中的void*替换为explicit operator bool () const的转化。当然,这使得代码无法编译为C ++ 11。

如何解决这个问题的方法是更改​​Calculator::inputstream_get,如下所示:

void* Calculator::inputstream_get(char& ch)
{
   ++inputpos;
   return input->get(ch) ? this : nullptr;
}

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

答案 1 :(得分:0)

回答你的上一个问题。您不能将非指针强制转换为指针。但是你可以使用(void *)

转换任何指向void指针的指针

答案 2 :(得分:0)

这是交易。 http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

在C ++ 03中,操作符为void *,在C ++ 11中是操作符bool。

将void *更改为bool。请注意,更改后,代码将无法在C ++ 03编译器中使用。你可以用便携式方式解决它

if (input->get(ch)) return true;
else return false;

实际上,最恰当的方法是返回对实际istream对象的引用。