Überladen von Template-Member-Funktionen und Mehrfachvererbung in C++
-
13-12-2019 - |
Frage
Ich beobachte im folgenden Code ein Verhalten, das ich nicht ohne weiteres erklären kann und dessen Theorie ich gerne besser verstehen würde.Ich kann anscheinend keine Online-Dokumentationsquelle oder vorhandene Frage finden, die diese spezielle Situation abdeckt.Als Referenz verwende ich Visual Studio C++ 2010, um den folgenden Code zu kompilieren und auszuführen:
#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>();
}
Warum funktioniert dies bei der Template-Member-Funktion anders als bei der Template-Member-Funktion?Fälle von Mitgliedsfunktionen ohne Vorlage?
Wie entscheidet der Compiler (im Fall der Vorlage), dass Top_Class::Print_Goodbye() die geeignete Überladung ist und nicht Bottom_Class::Print_Goodbye() ?
Vielen Dank im Voraus für Ihre Aufmerksamkeit.
Lösung
Im Dispatch
Methode, This_Type
ist das gleiche wie My_Merged_Class
.Der My_Merged_Class
hat zwei Methoden mit den Namen von Print_Hello
, natürlich wird der Compiler Probleme haben, zwischen ihnen zu unterscheiden.
Der Aufruf an Print_Hello
In Dispatch
, nach dem Ersetzen der Vorlage, sieht so aus:
((My_Merged_Class*)this)->Print_Hello();
Ich hoffe, dass die obige Ersetzung Ihnen hilft, besser zu erkennen, warum es eine Unklarheit gibt.Dasselbe Problem sollen tatsächlich auftreten Print_Goodbye
, aber es könnte ein Fehler im von Ihnen verwendeten Compiler sein, der dies durchlässt.
Andere Tipps
Beide Kommentare (AFAIK ordnungsgemäß) generieren Compilation-Fehler mit GCC 4.6.3.Möglicherweise ist der Microsoft Compiler etwas Falsches.
generasacodicetagpre.