Должно ли это компилироваться (вложенные private классы)? в избранное  новое всё   подписка   модер. 
От: Xentraxhttp://www.lanovets.ru
Дата: 29.05.08 17:09
Имеем вложенный закрытый класс с пользовательским оператором delete. Попытка использовать std::tr1::shared_ptr<> обламывается в VC2008 на шаблонной функции. Вот упрощенный пример:

#include <cstdlib> 

template <typename T> void destroy(T* ptr) 
{ 
  delete ptr; // line #5 
} 

class A 
{ 
private: 
  class B 
  { 
  public: 
    void test() 
    { 
        B* p = new B; 
        destroy(p); 
    } 

    ~B() 
    { 
    } 

    void* operator new(size_t size) 
    { 
        return malloc(size); 
    } 

    void operator delete(void* p, size_t /*size*/) 
    { 
        free(p); 
    } 
  }; 
};



Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

cl15.cpp
cl15.cpp(5) : error C2248: 'A::B' : cannot access private class declared in class 'A'
cl15.cpp(12) : see declaration of 'A::B'
cl15.cpp(9) : see declaration of 'A'
cl15.cpp(17) : see reference to function template instantiation 'void destroy<A::B>(T *)' being compiled
with
[
T=A::B
]



Вот так вариант с shared_ptr<>

#include <cstdlib> 
#include <memory>

class A 
{ 
private: 
  class B 
  { 
  public: 
    void test() 
    { 
        std::tr1::shared_ptr<B> b(new B());
    } 

    ~B() 
    { 
    } 

    void* operator new(size_t size) 
    { 
        return malloc(size); 
    } 

    void operator delete(void* p, size_t /*size*/) 
    { 
        free(p); 
    } 
  }; 
};