2016-06-03 1 views
-2

J'ai vu des réponses à ce sujet dans d'autres sujets sur Stack Overflow, mais je ne sais pas quoi faire dans mon cas. Je suis tout nouveau dans les modèles et c'est le premier modèle que j'ai créé/créé en utilisant des exemples trouvés sur ce site. Quoi qu'il en soit, voici le code ci-dessous et l'erreur associée:La classe de base doit être explicitement initialisée dans le constructeur de la copie.

warning: base class 'class std::allocator<char>' should be explicitly initialized in the copy constructor [-Wextra] SecureString(const SecureString &) throw() {}

template<class T> class SecureString : public std::allocator<T> { 
    public: 
    template<class U> struct rebind { typedef SecureString<U> other; }; 
    SecureString() throw() {} 
    SecureString(const SecureString &) throw() {} 
    template <class U> SecureString(const SecureString<U>&) throw() {} 
    void deallocate(T *p, size_t n) { 
     #ifdef _WIN32 
     SecureZeroMemory((void *)p, n); 
     #elif __linux__ 
     std::fill_n((volatile char *)p, (n * sizeof(T)), 0); 
     #endif 
     std::allocator<T>::deallocate(p, n); 
    } 
}; 

Il y a plus d'erreurs, mais c'est le principal. J'apprends mieux des exemples, donc toute aide serait grandement appréciée, merci.

Répondre

1

C'est ce que je suis arrivé du message d'avertissement (copie de construire la base, aussi): si vous ne prévoyez pas de faire quoi que ce soit il utile

SecureString(SecureString const& other) throw() : std::allocator<T>(other) {} 

congé Mieux vaut en faire default:

SecureString(SecureString const&) throw() = default; 

et consider dumping the throw() exception specification.

+0

Merci, en fait j'ajouté le 'std :: allocateur (qui)' hier, mais je ne savais pas pourquoi il fixe l'erreur jusqu'à présent . Le lien est utile aussi :) –

1

Votre constructeur de copie ne copie rien - et en particulier ne copie pas la classe de base. La solution la plus simple serait de l'omettre (et le constructeur par défaut), puisque les versions générées par le compilateur feront le bon choix.

A défaut, vous pouvez copier explicitement la base:

SecureString(const SecureString &other) throw() : allocator(other) {}