dort:Spezialisierung der Elementfunktion der Vorlagenklasse
Was ist das Ergebnis der folgenden Codes?
foo.h
#include <iostream>
template<class _Tp>
struct Foo
{
void print() { std::cout << "foo\n"; }
};
foo.cxx
#include "foo.h"
template<>
void Foo<int>::print()
{
std::cout << "foo<int>\n";
}
main.cxx
#include "foo.h"
int main()
{
Foo<double>().print();
Foo<int>().print();
return 0;
}
Die Ergebnisse sind unterschiedlich:
, wenn sie von MSVC erfüllt,
foo foo
, wenn sie von g ++ kompiliert,
foo foo<int>
Ich möchte das zweite Ergebnis unabhängig von Compiler erhalten. Was soll ich zusätzlich tun? Wenn möglich, würden Sie mir eine Erklärung zu den zugrunde liegenden Standards oder Mechanismen geben. Vielen Dank!
Das "Ergebnis der folgenden Codes" ist ein Kompilierungsfehler in foo.cxx, da es keinen gültigen C++ - Code enthält. –
Ich habe geändert falsch eingegeben: void Foo :: void print() -> void Foo :: print() Würden Sie wieder sehen, danke. –
Sie müssen nur die Spezialisierung in der Header-Datei deklarieren, so dass sie in allen Übersetzungseinheiten sichtbar ist. Fügen Sie eine 'Vorlage <> void Foo :: print();' Deklaration in die Header-Datei hinzu. –