2016-12-18 3 views
-3

я определить класс, который имеет шаблон члена, вместо по умолчанию 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; 
}; 
+1

Я подозреваю, что многие ошибки, которые вы получаете, не имеют ничего общего с пользовательским удалением. Конечно, в том числе фактические сообщения об ошибках в вашем вопросе (которые должны быть всегда выполнены *) подтвердят это. – WhozCraig

+0

@WhozCraig Я добавил сообщения об ошибках в код. –

+0

Вы не можете инициализировать член в классе с помощью этого синтаксиса. Попробуйте инициализатор с равным или равным. –

ответ

0

В initialize_list вы можете использоваться самоопределенным Deleter как

shared_ptr<set<int>> r = shared_ptr<set<int>>(new set<int>, DebugDelete()); 

в и вы не должны использовать один shared_ptr для инициализации другого.

+0

Я изменил свой код, как вы сказали, и он скомпилирован. Но я также определяю функцию-член класса A - 'void B() {shared_ptr > ptr (новый набор , DebugDelete()); } '- как' public', так и 'private' компилируются. Как это произошло? –

+0

Ваша функция void B() является конструктором shared_ptr с именем ptr. Мой ответ назначает переменную-член. В стандарте C++ 11 переменная-член может быть инициализирована в классе definition.example: [link] (http://en.cppreference.com/w/cpp/language/data_members) –

+0

nm - это еще один способ инициализации переменной member.the Initializer_lists, см .: [link] (https://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists) –

Смежные вопросы