1

重複の可能性:
std::map::const_iterator テンプレートのコンパイル エラー

アイデアは、コンテナー タイプをテンプレート パラメーターとして受け取る関数を作成することです。マップは、他の順次コンテナーとは異なる方法で合計する必要があるため、以下に示すように、マップの Sum 関数をオーバーロードしました。

これは私にエラーを与えている関数です:

template<typename T1, typename T2>
double Sum(const map<T1,T2>& input)
{
double finalSum=0;
map<T1,T2>::const_iterator iter_begin=input.begin();
map<T1,T2>::const_iterator iter_end=input.end();

for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
    finalSum=finalSum+(iter_begin)->second;
}
return finalSum;
}

エラー:

1>c:\documents and settings\keep\my documents\visual studio 2010\projects\level 7\exercise 2\exercise 2\sum.h(34): エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません

1>c:\documents and settings\keep\my documents\visual studio 2010\projects\level 7\exercise 2\exercise 2\sum.h(34): エラー C2143: 構文エラー: '<' の前に ',' がありません

この関数は、ヘッダー ファイルの一部です。私のヘッダーファイルには、関数定義も含まれています。

いくつかのこと: 1. typename で試しましたが、間違っている可能性があります。テンプレートはまだ私の得意分野ではありません。typename がどこかで必要な場合は、遠慮なく指摘してください。インラインキーワードは役に立ちますか?

  1. 私のガイドのマシンでは、同じコードが正常にコンパイルされています。私のはVC++ 2010 Express SP1です。彼の VC++ のバージョンはわかりません。

前もって感謝します。

編集: ヘッダー ファイル全体を投稿しています。しかし、同じエラー。Sum の最初のバージョンは、typename なしで正常にコンパイルされます。マップ用にオーバーロードされた2番目のものは問題を引き起こしています。

#ifndef SUM_H
#define SUM_H

template<typename T>    
double Sum(const T& input)                                                  
{
double finalSum=0;
T::const_iterator iter_begin=input.begin();
T::const_iterator iter_end=input.end();

for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
    finalSum=finalSum+(*iter_begin);
}
return finalSum;
}


//Mysterion !!!!!
template<typename T1, typename T2>
double Sum(const map<T1,T2>& input)
{
double finalSum=0;
typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();

for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
    finalSum=finalSum+(iter_begin)->second;
}
return finalSum;
}   

#endif

エラーが発生しています: double Sum(const map& input)

4

4 に答える 4

1

忘れていましたが#include <map>、その名前をstd修飾子で修飾する必要があります。これは、そこにあるためmapです。

typenameVC++ は寛容 (かつ準拠していない) であるため、(追加するのは良いことですが)についてはあまり心配しないでください。したがって、これは主要なエラーではありません。

于 2012-11-23T18:08:32.297 に答える
1

typenamesが必要な場所は次のとおりです。

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
于 2012-11-23T17:31:40.143 に答える
1

ご想像のとおり、 が必要typenameです。大まかに言うと、 を使用して型を参照していて::、 の左側にあるものが::テンプレート引数に依存している場合は、 を使用する必要がありますtypename。だからあなたの場合:

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
于 2012-11-23T17:33:58.520 に答える
0

typename依存名であるため、使用する必要がありますconst_iterator(この用語を検索すると、多くの説明が見つかります)。

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();

まあ、それは醜く見えます。

C++11 ではauto、生活が楽になります。

auto iter_begin=input.cbegin(); //use cbegin, instead of begin
auto iter_end=input.cend();     //use cend, instead of end

または範囲ベースのforループ:

for(auto item : input)
{ 
   finalSum = finalSum + item.second;
}  
于 2012-11-23T17:35:51.780 に答える