3 Stimmen

Ungelöste Externe bei Verwendung von Vorlagen

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.

0voto

MaximG Punkte 104

Welchen Compiler verwenden Sie?

VS2010 ist mit diesem Code zufrieden:

namespace util
{
    template<typename T>
    class BaseArrayIterator
    {
    public:
        typedef ptrdiff_t difference_type;

        int pos;
        T x;
    };

    template<typename T>
    typename BaseArrayIterator<T>::difference_type operator -
        (const BaseArrayIterator<T> &itL,
         const BaseArrayIterator<T> &itR);

    template<typename T>
    typename BaseArrayIterator<T>::difference_type operator -
        (const BaseArrayIterator<T> &itL,
         const BaseArrayIterator<T> &itR)
    {
        return itL.pos - itR.pos;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    util::BaseArrayIterator<int> a;
    util::BaseArrayIterator<int> b;

    ptrdiff_t dist = a - b;
    return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X