Ich habe eine Painter
Vorlage Klasse mit paint()
Vorlage Funktion. Ich verwende Tagging, um die Template-Funktion innerhalb der Template-Klasse zu spezialisieren. Ich habe die Definition der Template-Funktion paint()
innerhalb Painter.h
platziert und überladen Funktion innerhalb Painter.cpp
.Mehrdeutige Vorlage Spezialisierung
Ich bekomme einen Compilerfehler, wenn ich paint()
in Painter.cpp
explizit instanziiere. Meine Anforderung ist, dass ich die Implementierung der überladenen Funktion paint(ColorTag<Color::RED>)
in der Datei Painter.cpp brauche.
Quelldateien sind wie folgt:
Painter.h
#include <iostream>
enum class Color {
RED = 0,
GREEN = 1,
BLUE = 2
};
template<Color>
struct ColorTag {
};
template<typename T>
class Painter {
public:
template<Color MyColor>
void paint(ColorTag<MyColor>);
void paint(ColorTag<Color::RED>);
};
template<typename T>
template<Color MyColor>
void Painter<T>::paint(ColorTag<MyColor>){
std::cout << "General" << std::endl;
}
Painter.cpp
#include "Painter.h"
template<typename T>
void Painter<T>::paint(ColorTag<Color::RED>){
std::cout << "RED" << std::endl;
}
template void Painter<int>::paint(ColorTag<Color::RED>);
Main.cpp
#include "Painter.h"
int main(){
Painter<int> painter;
painter.paint(ColorTag<Color::RED>());
return 0;
}
Zusammengestellt
g++ Main.cpp Painter.cpp -std=c++11
ich mit Compiler-Fehler folgt, wenn ich
Painter.cpp:8:15: error: ambiguous template specialization ‘paint<>’ for ‘void Painter<int>::paint(ColorTag<(Color)0>)’
template void Painter<int>::paint(ColorTag<Color::RED>);
^
Painter.cpp:4:6: note: candidates are: void Painter<T>::paint(ColorTag<(Color)0>) [with T = int]
void Painter<T>::paint(ColorTag<Color::RED>){
^
In file included from Painter.cpp:1:0:
Painter.h:20:10: note: template<Color MyColor> void Painter<T>::paint(ColorTag<MyColor>) [with Color MyColor = MyColor; T = int]
void paint(ColorTag<MyColor>);
ausdrücklich paint()
in Painter.cpp instanziiert Was ich versucht
Zum einen I erstellt eine Vorlage functio n rief instantiatePaint()
auf paint()
Funktion zu rufen. Dann habe ich es in Painter.cpp
Datei platziert und instanziiert. Das hat funktioniert. Aber diese Art von fühlt sich peinlich an.
template<typename T>
template<Color MyColor>
void Painter<T>::instantiatePaint(ColorTag<MyColor>){
paint(ColorTag<MyColor>());
}
template void Painter<int>::instantiatePaint(ColorTag<Color::RED>);
Zweitens verschoben überladene Funktion Definition Painter.cpp
-Painter.h
. Dies funktioniert aber bricht meine Anforderung über die Funktion paint(ColorTag<Color::RED>)
in Painter.cpp
überlastet.
Gibt es bessere Methoden, um das Problem zu beheben oder was genau verursacht die Mehrdeutigkeit?
bitte antworten Sie sehr sicher sind, dass dies 100% Arbeit „nicht sicher“ macht es brenzlig – piyushj
, weil ich es nicht auf GCC geprüft habe ich irgendwo Doppel Vorlage lesen ist Compiler abhängig. – Jai