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) {}
我在 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) {}