我发现了一个旧的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'强制转换为无效指针?
非常感谢你的帮助
答案 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对象的引用。