2017-02-15 6 views
4

私は古いC++ DLLを発見しました。私はVS2015の私のプロジェクトの1つにしたいと思います。voidポインタ関数の出力

問題はコンパイルできないということです。私は最初にコードを作ったチームの人と連絡を取り合いました。彼は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をvoidポインタに 'キャスト'する方法はありますか?

ご協力ありがとうございます。

+0

'void *'は、あらゆるタイプの完全停止ではなく、あらゆるタイプのポインタを表すことができます。 'std :: basic_istream >'はポインタ型ではないので、 'void *'に変換することはできません。 'std :: basic_istream > *'でもかまいません。 – Kevin

+0

_私は最初にコードを作ったチームの人と連絡を取り合いました。彼はVS2010でコンパイルされたコードと全く同じであることを確信しています._あなたの人の声明は正しいです - ** VS2010で**コンパイルします。 –

+0

あなたのコメントから、これは「正しい」コードではない(VS2015に関する限り)。 なぜそれがVS2010でコンパイルされましたか?標準は変更されていますか? 助けてくれてありがとう – Maxime

答えて

6

これはVS 2010(C++ 03)でコンパイルされ、VS 2015(C++ 11)ではコンパイルされない理由はC++標準ライブラリー・ストリームは暗黙の変換をvoid*に定義しました。その変換の目的は暗黙的な変換をbool(これは1 + (cin >> x)というような怪物をコンパイルすることを許す)にすることなく真実性(例えばwhile (cin >> x))をテストすることでした。

注意返さvoid*はunderspecifiedされたこと:ストリームが失敗した状態、または不特定の非NULLポインタSTRAMの良好な状態にあるにあるときには、NULLポインタのいずれかでした。

C++ 11はvoid*これらの「ハック」変換は安全explicit operator bool() constにより規格に置き換えられたことを意味する、boolに明示的な変換演算子とコンテキスト変換の概念を導入しました。もちろん、これによりコードがC++ 11としてコンパイルできなくなります。次のようにあなたがこの問題を解決するにはどうすればよい

は変更Calculator::inputstream_get次のとおりです。

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

これが失敗した場合にNULLポインタ、および成功した場合に、不特定非NULLポインタを返すのセマンティクスを保持します。

+1

提案されたソリューションは、C++ 03/VS2010と下位互換性があることに注意してください。 – MSalters

0

最後の質問にお答えします。非ポインタをポインタにキャストすることはできません。しかし、(void *)でvoidポインタへのポインタをキャストすることができます

+0

voidポインタを_to_に変換する場合にのみ、voidポインタを変換する場合はキャストは必要ありません。 –

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オブジェクトへの参照を返すことです。

関連する問題