Dieser Code wird kompiliert (Visual Studio 2013). Beachten Sie, dass ich Set
, nicht Set<T>
als Parameter an operator = im Funktionskörper übergebe, der außerhalb der Klassendefinition liegt. Aber ich kann Set
nicht zurückgeben oder es muss ein Mitglied von Set
sein; es muss Set<T>
zurückgeben und ein Mitglied von Set<T>
sein.In Template-Klassenmember Funktionskörper außerhalb der Klassendefinition, wann sind Template-Parameter erforderlich?
Wo ist es legitim, die Template-Parameter wegzulassen? Inside the class definition, und wo sonst?
Ist dies eine Änderung des Standards? Ich versuche, die Kompatibilität mit allen vorhandenen Versionen, einschließlich 98 zu erhalten.
template <typename T>
class Set
{
public:
Set() {}
const Set& operator=(const Set& rhs);
//Shouldn't this have to be
//const Set<T>& operator= (const Set<T>& rhs); ?
};
template <typename T>
const Set<T>& Set<T>::operator= (const Set& rhs) //<-- HERE
{
Set temp; //<-- AND HERE
/* ... */
return *this;
}
int main()
{
Set<int> S, T;
T = S;
}
AFAIK nur Klassen tun dies, da sie eine injizierte-class-name – NathanOliver
haben und hier: 'template Auto Set :: operator = (const Set &) -> const Set & ' –
' void main' ist ungültig und hätte viele (die meisten) Leser daran gehindert, Ihren Code auszuprobieren. Das habe ich behoben. Bitte geben Sie keinen Code mit 'void main' ein, es sei denn, die Frage bezieht sich speziell darauf, weil es neue Leser irreführt und es unmöglich macht, Ihren Code einfach zu kopieren und einzufügen, es sei denn, Sie verwenden einen der wenigen Compiler das akzeptiere es. –