宿題のために、私は私の独自のバージョンを作成しようとしているstd::find
、std::begin
、std::end
、とstd::size
。
私はこのようなコードをいくつか書きました:
#include <vector>
template <typename I, typename T>
I find(const I& beg, const I& end, const T& sought)
{/* ... */}
template <typename T, size_t S>
T* begin(T (&a)[S])
{return &a;}
template <typename T, size_t S>
T* end(T (&a)[S])
{return &a + S;}
template <typename T, size_t S>
constexpr size_t size(T (&)[S])
{return S;}
int main()
{
std::vector<int> vec = {0, 1, 2, 3};
// ...
// test not-found case (and `size()`)
find(begin(vec), end(vec), size(vec));
// ...
return 0;
}
(size_t
暗黙的にに変換する必要がありますint
)
ただし、コンパイルすると、clangは次のエラーを出します。
$ clang++ -o program ./*.cpp -std=c++11 -Wall -Wextra -Wpedantic -Wconversion -Wnon-virtual-dtor
./main.cpp:##:##: error: no matching function for call to 'size'
find(begin(vec), end(vec), size(vec)
^~~~
./main.cpp:##:##: note: candidate template ignored: could not match 'T [S]' against 'std::vector<int>'
constexpr size_t size(T (&)[S])
^
1 error generated.
本当に困惑しているのは、size()
とbegin()
/の両方end()
がまったく同じテンプレート構造とパラメーターリストを持っているにもかかわらず、前者はコンパイルエラーをスローし、後者は同じ入力を与えられた場合はスローしないことです。
戻り値の型の違いが問題になるとは思いません。なぜなら、それがfind()
不平を言っているのであれば、そうではないからsize()
です。
ではsize()
、同じテンプレート構造、パラメーターリスト、および入力でこのエラーをスローする他の関数とどのように違うのでしょうか。
あなたはどれもbegin
/ end
/size
彼らは唯一の生のアレイ(タイプに一致するためのテンプレートは、一致していないT[S]
()とタイプのために使用しているではありませんstd::vector<T>
)。呼び出しがするので、あなたは、唯一のエラーを取得begin
し、end
機能にマッチしますstd::begin
し、std::end
原因に、引数依存のルックアップ。何もありませんstd::size
のための唯一の可能な一致はして(C ++ 11での)関数は、size
あなたのあるsize
一致していない機能を使用すると、エラーが発生しますので、。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加