テンプレート引数の演繹が実際にどのように機能するかについての優れた説明は得られていないため、次のように動作を説明する方法がわかりません。
template<typename T>
struct Base
{
protected:
template<bool aBool = true>
static void Bar(int)
{
}
};
template<typename T>
class Derived : public Base<T>
{
public:
void Foo() { Base<T>::Bar<false>(5); }
};
int main()
{
Derived<int> v;
v.Foo();
return 0;
}
このコードはビルドされず、エラーが発生します。
main.cpp: In instantiation of 'void Derived<T>::Foo() [with T = int]':
main.cpp:25:8: required from here main.cpp:19:15: error: invalid
operands of types '<unresolved overloaded function type>' and 'bool'
to binary 'operator<'
Base<T>
Derivedの2をに変更するとBase<int>
、コンパイルされます。呼び出しをBar()
に変更するとBase<T>::template Bar<false>(5);
、コンパイルも行われます。
これについての説明として私が見たワンライナーは、コンパイラがBarがテンプレートであることを知らないということです。おそらく、Derivedの特殊化が宣言されるまで、Baseが何であるかを知らないためです。ただし、コンパイラがのコードの生成を開始するとFoo()
、Base<T>
はすでに定義されており、のタイプをBar
判別できます。コンパイラがシンボルがテンプレートでBar
はないoperator<()
と想定し、代わりに適用しようとしている原因は何ですか?
コンパイルプロセスでテンプレートが評価されるときのルールに関係していると思います-私が探しているのは、このプロセスの優れた包括的な説明であり、次に次のようなコードに遭遇したときに、スタックオーバーフローの善良な人々の助けなしに答えを推測することができます。
c++x11をサポートするg++4.7でコンパイルしていることに注意してください。