2017-02-09 13 views
1

std::complex<float>のバイナリファイルを読み込もうとしています。私は次のコードを、as suggested in this SO answer試してみました:istreambuf_iteratorから構築したときにベクトルサイズを取得できません

#include <complex> 
#include <iostream> 
#include <iterator> 
#include <fstream> 
#include <string> 
#include <vector> 


void readRawFile(const std::string inputFile){ 
    std::ifstream input(inputFile, std::ios::binary); 
    std::vector<std::complex<float>> auxBuffer(std::istreambuf_iterator<std::complex<float>>(input), std::istreambuf_iterator<std::complex<float>>()); 
    std::cout << "Number of raw samples read: " << auxBuffer.size(); 
} 

int main(){ 
    readRawFile("myRawFile.raw"); 
    return 0; 
} 

をそして、私は、次のコンパイルエラーを取得:

In function 'void readRawFile(std::string)': 12:59: error: request for member 'size' in 'auxBuffer', which is of non-class type 'std::vector<std::complex<float> >(std::istreambuf_iterator<std::complex<float> >, std::istreambuf_iterator<std::complex<float> > (*)())' 

を私が作成したベクトルの大きさのメソッドにアクセスすることができない理由を私は理解していませんコンパイルエラーなし。私はベクトルがどのように作成されているかと関係があると思いますが、代わりにエラーを出さないということは私には奇妙に思えます。

これについての説明はありますか?

+2

ほとんどのVexing Parse? @WiinZTim。 – WhiZTiM

答えて

2

C++のMost Vexing Parseにヒットしました。あなたの宣言は、関数の宣言と解釈された。

あなたがいずれかを実行できます。

void readRawFile(const std::string inputFile){ 
    std::ifstream input(inputFile, std::ios::binary); 

    auto start = std::istream_iterator<std::complex<float>>(input); 
    auto stop = std::istream_iterator<std::complex<float>>(); 

    std::vector<std::complex<float>> auxBuffer(start, stop); 
    std::cout << "Number of raw samples read: " << auxBuffer.size(); 
} 

それとも制服ブレースの初期化(C++ 11)を使用する:

void readRawFile(const std::string inputFile){ 
    std::ifstream input(inputFile, std::ios::binary); 
    std::vector<std::complex<float>> auxBuffer{std::istream_iterator<std::complex<float>>(input), std::istream_iterator<std::complex<float>>()}; 
    std::cout << "Number of raw samples read: " << auxBuffer.size(); 
} 

ライブHere

+0

。 'Tオブジェクト{}'はコンストラクタとして**直接初期化**または**均一なブレース初期化**と呼ばれます。 –

+0

「std :: vector :: vector() 'の呼び出しで一致する関数がありません –

+0

実際に両方の実装がコンパイルエラーを出しています。最初のものはistreambuf_iteratorコンストラクタで複雑なのサポートがないためです –

4

コピーされた答えは、生の文字をストリームからバッファに読み込む方法を示しています。それはistreambuf_iteratorの正しい使い方です。

ストリームから複素数を抽出しようとしています。これは全く異なる操作で、文字「」を読み取ってから、「operator<<」と解釈します。それはistreambuf_iteratorのためではありません。タイプistreambuf_iterator<complex<float>>はタイプcomplex<float>の文字を意味がないbasic_streambuf<complex<float>>から抽出しようとします。これは文字型ではなく、生の文字として複雑な数値を含むstreambufを持つことはできません。

istreambuf_iteratorは、streambufから1文字を読み込むためのもので、文字を解析して(複雑な)数字やその他の型として解釈するものではありません。

あなたははistreamからX値を抽出するためにstd::istream_iterator<X>を使用する必要があるので、あなたが最も厄介なパースを修正した後、あなたはイテレータ型としてstd::istream_iterator<std::complex<float>>を使用する必要があります。

関連する問題