2009-11-13 6 views
0

J'ai cette classeclasse ne peut pas redéfinir basé sur un modèle opérateur []

namespace baseUtils { 

template<typename AT> 
class growVector { 

     int size; 
     AT **arr; 
     AT* defaultVal; 

    public: 

     growVector(int size, AT* defaultVal); //Expects number of elements (5) and default value (NULL) 
     AT*& operator[](unsigned pos); 
     int length(); 
     void reset(int pos); //Resets an element to default value 
     void reset();   //Resets all elements to default value 
     ~growVector(); 
}; 

} 

et c'est la mise en œuvre pour l'opérateur []

template<typename AT> 
AT*& growVector<AT>::operator [](unsigned pos){ 
    if (pos >= size){ 
     int newSize = size*2; 
     AT** newArr = new AT*[newSize]; 
     memcpy(newArr, arr, sizeof(AT)*size); 
     for (int i = size; i<newSize; i++) 
      newArr[i] = defaultVal; 
     size = newSize; 
     delete arr; 
     arr = newArr; 
    } 
    return arr[pos]; 
} 

(oui je me rends compte que je ne vérifie pas si la taille * 2> = pos ... mais ce n'est pas le point maintenant) si je l'utilise dans le code comme:

int main() { 

    growVector<char> gv(); 
    char* x = NULL; 
    for (int i = 0; i< 50; i++){ 
     gv[i] = x; 
    } 
    gv.reset(); 
    return 0; 
} 

le compilateur dit

../src/base.cpp:98: warning: pointer to a function used in arithmetic 
../src/base.cpp:98: error: assignment of read-only location ‘*(gv + ((unsigned int)i))’ 
../src/base.cpp:98: error: cannot convert ‘char*’ to ‘baseUtils::growVector<char>()’ in assignment 

en référence à la ligne gv [i] = x; (On dirait qu'il ne voit pas la redéfinition de [])

Pourquoi ???? Qu'est-ce que je rate?


Après avoir corrigé le problème du constructeur que j'ai le sayng éditeur de liens:

/home/dario/workspace/base/Debug/../src/base.cpp:95: undefined reference to `baseUtils::growVector<char>::growVector(int, char*)' 
/home/dario/workspace/base/Debug/../src/base.cpp:98: undefined reference to `baseUtils::growVector<char>::operator[](unsigned int)' 
/home/dario/workspace/base/Debug/../src/base.cpp:100: undefined reference to `baseUtils::growVector<char>::reset()' 
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()' 
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()' 

comme il ne peut pas lier ... pourquoi ??? : O

Répondre

9

Le problème est votre déclaration

growVector<char> gv(); 

Le compilateur interprète cela comme la déclaration d'une fonction appelée gv qui retourne un growVector<char>, et non comme un objet que vous indend. Comme il n'y a pas de constructeur par défaut, cela ne compilera pas de toute façon. Changer à:

growVector<char> gv(0,0); 
+2

lol je ne regardais vraiment pas ... désolé quelle honte ... XD – gotch4

4

Le compilateur pense que cette ligne

growVector<char> gv(); 

est une fonction déclarant, au lieu d'une variable. Déposez le () et les choses devraient fonctionner.

1

Je voudrais simplement souligner que c'est une bonne habitude d'avoir deux versions de l'opérateur [] dans la classe: const (qui sera utilisée pour r-value) et non-const. Vous avez implémenté une version non const mais elle ne peut pas être utilisée dans les fonctions const ou dans toute fonction recevant une instance de votre classe en tant que référence const ou pointeur de pointeur sur const.

Questions connexes