5

この質問は、「呼び出されていないテンプレート クラス メンバーがインスタンス化されないのはなぜですか?」に対する反論です。、作成者は、一部のテンプレート メソッドがインスタンス化されていないことに驚きました。

逆の問題があります。関数の一部が、予期しないときにインスタンス化されています。次のプログラムを実行します。

template <class T> class Foo;

template <class T>
class Bar {
  template <class U> void Baz(typename Foo<T>::X x) {}
};

int main() {
  Bar<int> bar;
}

このプログラムは次のエラーでコンパイルに失敗します:

test.cc:6:40: error: implicit instantiation of undefined template 'Foo<int>'
  template <class U> void Baz(typename Foo<T>::X x) {}
                                       ^
test.cc:10:12: note: in instantiation of template class 'Bar<int>' requested here
  Bar<int> bar;
           ^
test.cc:2:26: note: template is declared here
template <class T> class Foo;

しかし、私が呼び出していない関数のパラメーターをインスタンス化しようとしているのはなぜですか? これは、それが知ることができないテンプレート パラメーターを持つテンプレート関数であり、関数の引数の型をインスタンス化することが二重に奇妙になります。

なぜこれを行うのですか?そして、なぜ SFINAE はここで役に立たず、最悪の場合、過負荷を考慮から除外するのでしょうか?

4

1 に答える 1