2011-12-14 6 views
2

コードの一番上の部分がコンパイルされず、下の部分がなぜ表示されるのか説明できる人はいますか?RHEL 6.0コードの2つの類似部分:1つがコンパイルされない

#include <iterator> 
#include <iostream> 
#include <set> 
#include <string> 
#include <fstream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    ifstream testFile; 
    testFile.open("opengl_functions", ios::in); 
    set<string> myset(istreambuf_iterator<string>(testFile), istreambuf_iterator<string>()); 

    set<string>::iterator it; 

    for (it = myset.begin(); it != myset.end(); ++it) { 
    } 
} 

//using namespace std; 
// 
//int main() 
//{ 
// int myints[] = {75,23,65,42,13}; 
// set<int> myset (myints,myints+5); 

// set<int>::iterator it; 

// cout << "myset contains:"; 
// for (it=myset.begin() ; it != myset.end(); it++) 
// cout << " " << *it; 

// cout << endl; 

// return 0; 
//} 

-

[[email protected] opengl_parser]$ make 
g++ -o parser -Wall ./parser.cpp 
./parser.cpp: In function ‘int main(int, char**)’: 
./parser.cpp:17: error: request for member ‘begin’ in ‘myset’, which is of non-class type ‘std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > (*)())’ 
./parser.cpp:17: error: request for member ‘end’ in ‘myset’, which is of non-class type ‘std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > (*)())’ 
make: *** [parser] Error 1 
+0

あなたはコンパイルエラーを投稿することができますか? –

答えて

3

あなたのコンパイラは、マイセットは、関数の宣言であると考えています。ルックアップ"the most vexing parse"。私はいつもistreamのイテレーターでそれを実行しているので、私はいつもそれらを事前に宣言します。副次的な利点として、私はそれがはるかに簡単に読むことを見つける:

std::istreambuf_iterator<string> begin(testFile), end; 
std::set<std::string> myset(begin, end); 

しかし、私は、異なる理由で、それはどちらかのコンパイルされます信じていません。 istreambuf_iteratorは、文字型にのみテンプレート化できます。あなたは代わりにistream_iteratorを使いたいでしょう。

+0

あなたはかっこの問題 –

+0

を持っていました。私は忍者がそれを編集しました。 –

+0

呪いの編集。 –

2

"myset"という宣言を関数として解釈しています。

また:文字列のために、あなたがistream_iteratorを必要とし、istreambuf_iteratorない:

set<string> myset((istream_iterator<string>(testFile)), (istream_iterator<string>())); 
+0

不要なカッコを覚えてください:) –

+0

+1括弧がこのように使用できるかどうかわかりませんでした... – fefe

+1

実際には関数の宣言から曖昧さを除去するために、実際には1組しか必要ありません。最初のセット(最初のパラメーター上)で十分です。そして、@セス:この場合、彼らは必要です! :) – Joe

関連する問題