Ich mische Operator-Redefinition mit Template-Klassen und bin zu folgender Aufgabe gelangt:
j = end - begin;
in meiner Hauptfunktion, wobei die Variablentypen wie folgt sind:
ptrdiff_t j;
util::BaseArrayIterator<int, 6> begin, end;
Anfang und Ende wurden aus einem util::BaseArray initialisiert:
util::BaseArray<int, 6> ba(SOME_PARAMETERS);
begin = ba.begin(); end = ba.end();
BaseArrayIterator ist ein selbst-implementierter Iterator-Typ.
Ich erhalte die Fehlermeldung:
TestProject.obj : error LNK2019: unresolved external symbol "int __cdecl util::operator-(class util::BaseArrayIterator<int,6> const &,class util::BaseArrayIterator<int,6> const &)" (??Gutil@@YAHABV?$BaseArrayIterator@H$05@0@0@Z) referenced in function _main
aufgrund der ersten Code-Anweisung in der Nachricht (durch Entfernen dieser Anweisung wird das Problem behoben).
Ich habe eine Header-Datei mit den folgenden Definitionen und Deklarationen eingefügt:
namespace util {
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -
(const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR);
...
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -(
const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR)
{ return -(itL.m_cnt - itR.m_cnt);
}
}
Was ist die Ursache des Problems? Der Compiler meldet, dass er nach einem util::operator - sucht, er hat also die Deklaration gefunden, aber nicht die Definition, obwohl sie in der gleichen Datei stehen. Und ich sehe keinen Signaturfehler.
--- EDIT NOTE -----------------------------------------------------------------------------
Ersetzen von
end-begin
mit
util::operator-<int, 6>(end,begin)
löst das Problem, aber ich möchte die Parameter nicht jedes Mal explizit angeben. Prägnanz ist eines der Hauptargumente für das Überladen von Operatoren, daher möchte ich die klassische Kurzform verwenden.
--- ANMERKUNG 2 BEARBEITEN ---------------------------------------------------------------------------
Wie Nicola Mussatti freundlicherweise andeutete, [eine Lösung]: Ungelöstes externes Symbol mit Operatorüberladung und Vorlagen zu diesem Problem finden Sie hier. Die Friend-Deklaration sollte innerhalb der Klasse verschoben werden.
Das habe ich getan, und ich lächle. Jetzt trennen sie wieder Fragen eine zweideutige Überlastung Probleme, die nicht der gleiche Fehler wie zuvor ist.