Base class 应该在复制构造函数中显式初始化

Base class should be explicitly initialized in the copy constructor

我在 Stack Overflow 的其他主题中看到了这方面的答案,但我不确定在我的情况下该怎么做。我是模板的新手,这是我/曾经/使用从该网站再次找到的示例创建的第一个模板。无论如何,这是下面的代码和相关的错误:

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

还有更多错误,但这是主要错误。我从示例中学习得最好,因此非常感谢任何帮助,谢谢。

这是我从警告消息中得到的信息(也复制构建基础):

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

如果你不打算在那里做任何有用的事情,最好把它留在default:

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

consider dumping the throw() exception specification.

您的复制构造函数没有复制任何东西 - 特别是没有复制基础 class。

最简单的解决方法是省略它(和默认构造函数),因为编译器生成的版本会做正确的事情。

如果您无法显式复制基数:

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