私は加速されたC++で自分のやり方を進めています&がExで問題を起こしました。 10.2 質問には、前の章のメジアン関数を書き換えることが含まれているため、ベクトルまたは組み込み配列で中央値を呼び出すことができます。中央値関数は、任意の算術型のコンテナも許可する必要があります。テンプレートでエラー:一致する関数呼び出しがありません
は、私は以下の中央値は、詳細には2本の電話をかけることはできません - 私は
No matching function for call to 'median'
私はテンプレートを使用した場合の種類は、コンパイル時に知られるべきであることを、いくつかの研究から集まるエラーメッセージが表示されます。これが根本的な問題かもしれませんか?何らかの形で型をテンプレート引数として渡す方法はありますか?ここで
は、これまでの私のコードです:
#include <iostream>
#include <vector>
#include <stdexcept>
#include <algorithm>
#include <cstddef>
using namespace std;
template <class Iterator, class Type>
Type median(Iterator begin, Iterator end)
{
vector<Type> vec(begin,end);
typedef typename vector<Type>::size_type container_sz;
container_sz size = vec.size();
if (size == 0) {
throw domain_error("median of an empty vector");
}
sort(vec.begin(), vec.end());
container_sz mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid - 1])/2 : vec[mid];
}
int main()
{
vector<int> grades;
for (int i = 0; i != 10; ++i){
grades.push_back(i);
}
const int int_array[] = {2, 9, 4, 6, 15};
size_t array_size = sizeof(int_array)/sizeof(*int_array);
cout << median(int_array, int_array + array_size) << endl; //error here: Semantic Issue, No matching function for call to 'median'
cout << median(grades.begin(), grades.end()) << endl; //error here: Semantic Issue, No matching function for call to 'median' "
return 0;
}
とは対照的に、また、一方が等級= {0、1、2、3、4 、5,6,7,8,9} 'と' auto size = vec.size(); '(つまり、typedefを取り除く)の3つです。また、 'endl'を' "\ n" 'に置き換えることもできます。 –
median<int>(grades.begin(), grades.end())
を呼び出す必要がありファーストパスリーダーにとっては、コンパイル時エラーの原因となる行(*があれば*両方*を含む)にコメント( '// <== error here'など)を付けてください。つまり、 'Type'テンプレートパラメータは、あなたが作る呼び出しから推測することはできません。これは最終的にはコアの問題です。私は、標準ライブラリ提供のテンプレート['iterator_traits'](http://en.cppreference.com/w/cpp/iterator/iterator_traits)はあなたの問題に対するきれいな解決策かもしれないと思います。 – WhozCraig
完全なエラーメッセージを含めてください。これは、通常、関数呼び出しでどの型を推測するかを示します。実際の予測型と比較することができます。 –