一部の関数では「 'T [S]'を 'std :: vector <int>'と一致させることができませんでした」が、同じパラメータリストを持つ他の関数では一致しませんでした

dan9er

宿題のために、私は私の独自のバージョンを作成しようとしているstd::findstd::beginstd::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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ