7

これはどのように作動しますか?ADLと関係ありますか?

#include <iostream>

template <typename T>
struct A
{
    friend void f(T x)
    {
        std::cout << "A\n";
    }
};

int main()
{
    f(new A<void*>());
}

なぜ私が次のようなものを使用できないのか誰か教えてもらえますか

f(A<int>());
4

1 に答える 1

13
f(new A<void*>());    

Indeed はArgument 依存ルックアップ/Koenig ルックアップ( ADL )のために機能します
。Koenig ルックアップは次のように述べています。

関数の名前空間で 1 つ以上の引数の型が定義されている場合、関数の名前空間 (スコープ) を修飾する必要はありません。

テンプレートを使用しない単純な例を考えてみましょう。これは、ADL の動作をよりよく理解するのに役立つはずです。

#include <iostream>
struct A
{
    friend void f(A x)
    {
        std::cout << "A\n";
    }
};

int main()
{
    f(A());
    return 0;
}

出力:

A

を使用すると、タイプ の引数が必要であるf(A<int>())ことが義務付けられますが、構造は からへの変換を提供しないため、エラーが発生します。f()intAint

適切な変換を指定すると、それも機能します。次のようなもの

operator int(){return 1;}
于 2012-09-05T04:37:30.280 に答える