2016-06-03 24 views
-2

Ich habe Antworten in anderen Themen auf Stack Overflow dafür gesehen, aber ich bin nicht sicher, was in meinem Fall zu tun ist. Ich bin brandneue Vorlagen und das ist die erste Vorlage, die ich/jemals/mit Beispielen gefunden habe, wieder von dieser Website. Wie auch immer, hier ist der Code unten und die damit verbundenen Fehler:Basisklasse sollte im Kopierkonstruktor explizit initialisiert werden

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); 
    } 
}; 

Es gibt mehr Fehler, aber das ist das wichtigste. Ich lerne am besten von Beispielen, so würde jede Hilfe sehr geschätzt werden, danke.

Antwort

1

Das ist, was ich von der Warnmeldung (copy-Konstrukt der Basis, auch) bekam:

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

Es ist besser tun default, wenn Sie etwas Nützliches es nicht tun wollen:

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

Und consider dumping the throw() exception specification.

+0

Danke, habe ich tatsächlich die 'std :: allocator (das)' gestern, aber ich war nicht sicher, warum es den Fehler behoben, bis jetzt . Der Link ist auch hilfreich :) –

1

Ihr Kopierkonstruktor kopiert nichts - und kopiert die Basisklasse nicht.

Die einfachste Lösung wäre, sie wegzulassen (und den Standardkonstruktor), da die vom Compiler erzeugten Versionen das Richtige tun.

Gelingt das nicht explizit die Basis kopieren:

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