アイデアは、コンテナー タイプをテンプレート パラメーターとして受け取る関数を作成することです。マップは、他の順次コンテナーとは異なる方法で合計する必要があるため、以下に示すように、マップの 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 がどこかで必要な場合は、遠慮なく指摘してください。インラインキーワードは役に立ちますか?
- 私のガイドのマシンでは、同じコードが正常にコンパイルされています。私のは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)