я определить класс, который имеет шаблон члена, вместо по умолчанию Deleter из станд :: shared_ptr:использовать самоопределенную Deleter в shared_ptr
class DebugDelete {
public:
DebugDelete(std::ostream &s = std::cerr): os(s) { }
// as with any function template, the type of T is deduced by the compiler
template <typename T> void operator()(T *p) const
{
os << "deleting unique_ptr" << std::endl;
delete p;
}
private:
std::ostream &os;
};
Когда я применить его к следующему коду, некоторые были зарегистрированы ошибки:
class A {
public:
// [Error] class 'A' does not have any field named 'r'
A(std::shared_ptr<std::set<int>> p): r(p) { } // 1: How can I use self-defined deleter to initialize r in constructor
A(int i): s(new std::set<int>, DebugDelete()) { } // 2: OK, what is the difference between this constructor and 3
private:
// [Error] expected identifier before 'new'
// [Error] expected ',' or '...' before 'new'
std::shared_ptr<std::set<int>> r(new std::set<int>, DebugDelete()); // 3: error
std::shared_ptr<std::set<int>> s;
};
Я подозреваю, что многие ошибки, которые вы получаете, не имеют ничего общего с пользовательским удалением. Конечно, в том числе фактические сообщения об ошибках в вашем вопросе (которые должны быть всегда выполнены *) подтвердят это. – WhozCraig
@WhozCraig Я добавил сообщения об ошибках в код. –
Вы не можете инициализировать член в классе с помощью этого синтаксиса. Попробуйте инициализатор с равным или равным. –