C ++ друг класс std :: vector - PullRequest
3 голосов
/ 25 мая 2010

Можно ли сделать следующее переносимо:

struct structure {
    structure() {}
private:
    // only allow container copy construct
    structure(const structure&) {}
    // in general, does not work because allocator (not vector) calls copy construct
    friend class std::vector<structure>;
};

пример сообщения при попытке компиляции выше:

In member function void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) 
[with _Tp = kernel_data<const double*>::block]:
...
/usr/include/c++/4.3/ext/new_allocator.h:108: error: within this context

Спасибо

У меня есть обходной путь, но мне любопытно, как это могло быть возможно

1 Ответ

4 голосов
/ 25 мая 2010

Нет. vector (точнее, распределитель, переданный в vector) может делегировать задачу построения свободной функции или другому классу, что делает корабль friend бесполезным.

Даже если вы передадите свой собственный распределитель, он может быть привязан к классу, внутреннему для реализации. Тогда конструктор для вашего класса может быть доступен из этого класса, а не из вашего распределителя. Так что, если это ваш обходной путь, это не гарантировано. (Хотя, глядя на реализацию GCC, он скрупулезно использует распределитель un-rebound для создания таких подобъектов.)

В libstdc ++ GCC ни один шаблон контейнера STL не создает содержащиеся объекты в области действия стандартного класса или функции.

...