Domanda

Osservando il comportamento nel seguente codice che non riesco a spiegare facilmente e vorrei capire la teoria di meglio.Non riesco a trovare una fonte di documentazione online o una domanda esistente che copre questa particolare situazione.Per riferimento, sto usando Visual Studio C ++ 2010 per compilare ed eseguire il seguente codice:

#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>();
}
.

Perché questo funziona in modo diverso per la funzione di elemento di membri modelli contro casi di funzioni di membro non modellato?

In che modo il compilatore decide (nel caso templated) che Top_Class :: Print_Goodbye () è il sovraccarico appropriato anziché il fondo_class :: Print_Goodbye ()?

Grazie in anticipo per la tua considerazione.

È stato utile?

Soluzione

Nel metodo Dispatch, This_Type è lo stesso di My_Merged_Class.Il My_Merged_Class ha due metodi con i nomi del Print_Hello, ovviamente il compilatore avrà problemi a distinguere tra loro.

La chiamata a Print_Hello in Dispatch, dopo la sostituzione del modello, è simile a questo:

((My_Merged_Class*)this)->Print_Hello();
.

Spero che la sostituzione di cui sopra ti aiuta a vedere meglio perché c'è un'ambiguità.Lo stesso problema dovrebbe essere effettivamente presente per Print_Goodbye, ma potrebbe essere un bug nel compilatore che stai utilizzando che lo consente.

Altri suggerimenti

Entrambi i commenti (AFAIK correttamente) generano errori di compilazione con GCC 4.6.3.Potrebbe essere il compilatore Microsoft sta facendo qualcosa di errato.

➜  scratch  g++ -O2 templ.cc
templ.cc: In member function ‘void Bottom_Class::Dispatch() [with This_Type = Merged_Class<Top_Class, Bottom_Class>]’:
templ.cc:42:48:   instantiated from here
templ.cc:16:9: error: request for member ‘Print_Goodbye’ is ambiguous
templ.cc:22:10: error: candidates are: template<class This_Type> void Bottom_Class::Print_Goodbye()
templ.cc:30:10: error:                 template<class This_Type> void Top_Class::Print_Goodbye()
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top