1

次のオーバーロードされた関数を検討してください。

template <class T>
void foo(const T& v)
{
    std::cout << "Generic version" << std::endl;
}

void foo(std::pair<const void*, std::size_t> p)
{
    std::cout << "Pair version" << std::endl;
}

以下では、2 番目のオーバーロード ( を取るものstd::pair) が呼び出されることを期待しています。

int main()
{
    const void* buf = 0;
    std::size_t sz = 0;
    foo(std::make_pair(buf, sz));
}

ただし、このコードは実際にはジェネリック バージョンを呼び出します。具体的に取るオーバーロードにバインドしないのはなぜstd::pairですか? これはコンパイラのバグですか? 私はかなり古いコンパイラ、GCC 4.1.2 を使用しています。

4

1 に答える 1

3
  • 特殊な関数をテンプレートとして宣言する必要があります
  • 特殊化された引数の型もテンプレート パラメーターに従う必要があります (つまり、const 参照である必要があります)。

試す

template <>
void foo(const std::pair<const void*, std::size_t>& p)
{
    ...
}
于 2013-09-27T14:49:09.483 に答える