2016-05-08 13 views
0

Ich habe ein echtes Problem, die wie folgt zusammengefasst werden können:Vorlage Mehrfachvererbung mehrdeutige Symbolfehler

template <typename BaseType> 
class TemplateClass 
{ 
public: 
    template <typename BaseTypee, unsigned PrefixID> 
    static void deleteType(unsigned int ObjID) 
    { 

    } 
}; 

class ParentClass: 
    public TemplateClass<ParentClass> 
{ 
}; 

class ChildClass: 
     public ParentClass, public TemplateClass<ChildClass> 
{ 
    using TemplateClass<ChildClass>::deleteType; //Ambigious Symbol Compiler-Error 

}; 

ich die Funktion deleteType wie folgt aufrufen:

TemplateClass<ChildClass>::deleteType<ChildClass, ChildType>(ChildType); 

Ich möchte die Funktion aufrufen deleteType in der ChildClass Klasse, aber ohne irgendeine Erklärung wird die Funktion in ParentClass aufgerufen werden.

Wie kann ich den ambigen Symbolfehler in der Using-Phrase loswerden? Kann ich meine Aufgabe mit einem anderen Ansatz erreichen?

FYI: Ursprünglich habe ich versucht Aufruf der Funktion mit (es ändert sich nichts)

ChildClass::deleteType<ChildClass, ChildType>(ChildType); 

Komische: es stellt nach wie vor, obwohl eine rot unterstrichen hat. Wenn ich debuggen, wird die Vorlage noch in Parent genannt werden, bei der Kompilierung keine Warnung noch Fehler geworfen ..

+0

Bitte geben Sie eine [MCVE] . – Barry

+1

'ChildClass :: TemplateClass :: deleteType (ChildType);' – Pixelchemist

+0

Sie haben zwei völlig unterschiedliche, nicht verwandte Template-Parameter mit dem Namen 'BaseType', von dem Ihr' deleteType' abhängt. Einer ist ein Parameter von 'TemplateClass' und der andere ist ein Parameter von' deleteType'. Insgesamt hängt "deleteType" von drei Vorlagenparametern ab, von denen einer den gleichen Namen und der andere den gleichen Namen hat. Das willst du wahrscheinlich nicht. –

Antwort

1

Setzen Sie Ihre using Anweisung in einem public: Abschnitt:

template <typename BaseType> 
class TemplateClass 
{ 
public: 
    template <typename BaseTypee, unsigned PrefixID> 
    static void deleteType(unsigned int ObjID) 
    { 
    } 
}; 

class ParentClass: 
    public TemplateClass<ParentClass> 
{ 
}; 

class ChildClass: 
     public ParentClass, public TemplateClass<ChildClass> 
{ 
public: 
    using TemplateClass<ChildClass>::deleteType; 
}; 

int main() { 
    ChildClass::deleteType<void, 0>(0); 
} 
+0

TemplateClass wird immer noch rot unterstrichen mit dem gleichen Fehler: * Ambigious Symbol 'TemplateClass :: deleteType' *, lustige Sache: es kompiliert noch, obwohl es eine rote Unterstreichung hat. Wenn ich debugge, wird die Vorlage immer noch aufgerufen in * ParentClass * @Johan Boule – Pepelee

+0

Welche Compiler/IDE verwenden Sie? –

+0

Es funktionierte jetzt richtig, ich hatte einige Probleme mit Destruktoren in meiner tiefen Implementierung. Deine Lösung ist richtig :-) Grüße – Pepelee