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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top