以下のコードの動作を観察していますが、これは簡単には説明できず、理論をよりよく理解したいと考えています。この特定の状況をカバーするオンライン ドキュメント ソースや既存の質問が見つからないようです。参考までに、Visual Studio C++ 2010 を使用して、次のコードをコンパイルして実行しています。
#include <iostream>
using namespace std;
struct Bottom_Class
{
template<typename This_Type>
void Dispatch()
{
// A: When this comment is removed, the program does not compile
// citing an ambiguous call to Print_Hello
// ((This_Type*)this)->Print_Hello();
// B: When this comment is removed instead, the program compiles and
// generates the following output:
// >> "Goodbye from Top Class!"
// ((This_Type*)this)->Print_Goodbye<void>();
}
void Print_Hello() {cout << "Hello from Bottom Class!" << endl;}
template<typename This_Type>
void Print_Goodbye() {cout << "Goodbye from Bottom Class!" << endl;}
};
struct Top_Class
{
void Print_Hello() {cout << "Hello from Top Class!" << endl;}
template<typename This_Type>
void Print_Goodbye() {cout << "Goodbye from Top Class!" << endl;}
};
template<typename Top_Type,typename Bottom_Type>
struct Merged_Class : public Top_Type, public Bottom_Type {};
typedef Merged_Class<Top_Class,Bottom_Class> My_Merged_Class;
void main()
{
My_Merged_Class my_merged_object;
my_merged_object.Dispatch<My_Merged_Class>();
}
テンプレート化されたメンバー関数とテンプレート化されていないメンバー関数の場合で、これが異なるのはなぜですか?
Top_Class::Print_Goodbye() が Bottom_Class::Print_Goodbye() ではなく適切なオーバーロードであることを (テンプレート化された場合に) コンパイラはどのように判断しますか?
よろしくお願いいたします。