2011-07-03 20 views
7

みんな! 私はマップコンテナにチャンネルデータのグループを保持しています。そこから個々のチャンネルデータにチャンネル名でアクセスできます。これに関しては、私は単純な関数GetIRChannelDataを書いています(次のコードを見てください)。 compliingときは、声明pusIRChannelData = cit->second();は何をするエラーC2064:用語は0引数を取る関数に評価されません

error C2064: term does not evaluate to a function taking 0 arguments 

すべての機能を読んでエラーが、マップコンテナ内の指定されたチャンネル名/ IDを検索し、一時的なポインタにそれをデータポインタを割り当てる以外の何ものでもありませんthrowed見つかった場合。何が間違っているか教えてください。

const Array2D<unsigned short>* GetIRChannelData(std::string sChannelName) const 
{ 
    const Array2D<unsigned short>* pusIRChannelData = NULL; 

    for (std::map<std::string, Array2D<unsigned short>* >::const_iterator cit = m_usIRDataPool.begin(); cit != m_usIRDataPool.end(); ++cit) 
    { 
     std::string sKey = cit->first; 

     if (sKey == sChannelName) 
     { 
      pusIRChannelData = cit->second(); // Error occurred on this line 
      break; 
     } 
    } 

    return pusIRChannelData; 
} 
+1

キーを探すすべての要素をループするのではなく、 'std :: map'の' find'メソッドを使用しない特別な理由はありますか? –

+0

補足として、型エイリアスは実際にコードを読みやすくするのに役立ちます: 'typedef std :: map <...> DataPool; for(DataPool :: const_iterator ... '。 –

答えて

12

エラーメッセージは明らかです...存在しない関数を呼び出します。 map::iteratorstd::pairを指し、firstsecondという2つのメンバーオブジェクトを持っています。これらは関数ではないことに注意してください。問題の行から()を削除すると、エラーは消えてしまいます。

+0

これは' std :: map'イテレータです、いいえ? 'first'はキーです。これは' std :: string'で宣言され、 'second'は値です。 – geekosaur

+0

@geekosaur:はい、ループの初期設定を誤っていましたが、地図の値の型を反復していたと思います –

+0

ありがとう、デニス私はこのような低レベルの間違いをしました – GoldenLee

3

cit->secondは、関数ポインタを識別していないようです。イテレータの定義は、それが(Array2D<unsigned short>)へのポインタだと主張しています。 pusIRChannelData(Array2D *)なので、cit->second()の代わりにcit->second(あなたの(Array2D *)を関数として呼び出そうとします)が必要です。

関連する問題