[解決済み] なぜADLは関数テンプレートを見つけられないのですか?
2023-05-10 16:08:34
質問
C++ の仕様のどの部分が、引数依存の検索が、関連する名前空間のセットで関数テンプレートを見つけることを制限していますか? 言い換えれば、なぜ最後の呼び出しが
main
の最後の呼び出しがコンパイルに失敗するのはなぜでしょうか?
namespace ns {
struct foo {};
template<int i> void frob(foo const&) {}
void non_template(foo const&) {}
}
int main() {
ns::foo f;
non_template(f); // This is fine.
frob<0>(f); // This is not.
}
どのように解決するのですか?
この部分に説明があります。
C++スタンダード03 14.8.1.6 :
[注意: 単純な関数名の場合、関数名が呼び出しのスコープ内で見えないときでも、 引数依存の検索 (3.4.2) が適用されます。これは、呼び出しがまだ関数呼び出しの構文形式(3.4.1)を持っているからです。しかし、明示的なテンプレート引数を持つ関数テンプレートを使用する場合、 呼び出しの時点でその名前を持つ関数テンプレートが見えていなければ、 呼び出しは正しい構文形式を持ちません。そのような名前が表示されていない場合、呼び出しは構文的に正しい形ではなく、引数依存の検索は適用されない。そのような名前が見える場合、引数依存の検索が適用され、追加の関数テンプレートが他の名前空間で見つかるかもしれません。
namespace A {
struct B { };
template<int X> void f(B);
}
namespace C {
template<class T> void f(T t);
}
void g(A::B b) {
f<3>(b); //ill-formed: not a function call
A::f<3>(b); //well-formed
C::f<3>(b); //ill-formed; argument dependent lookup
// applies only to unqualified names
using C::f;
f<3>(b); //well-formed because C::f is visible; then
// A::f is found by argument dependent lookup
}
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] Argument-Dependent Lookup」(別名ADL、「Koenig Lookup」)とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Enterキーを押して続行する