- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
template <typename type>
class some
{
type val;
public:
some( const type &a ) : val(a)
{ }
template<typename t>
some( const some<t> &a )
{
val = static_cast<type>(a.val);
}
template <typename type>
friend class some; // иначе ошибка - нет доступа к приватному члену
};
RAGE!
вроде можно только создавать друзей для инстанцированных классов.
Что-то типа:
friend class some<int>;
friend class some<type>;
а то что выше - не скомпилируется.
Ещё факт, что в студии, начиная, как минимум, с 2005 (более ранние не проверял), можно объявить другом собственный шаблонный аргумент:
template <typename T>
class C
{
friend T;
};
Стандарт, насколько удалось понять, это ранее запрещал по причине каких-то там неоднозначностей, но вроде бы в C++0x уже будет можно официально (пруф сейчас не найду, но упоминание такое встречал). По крайней мере, очень на это надеюсь, а то отличный паттерн пропадает... (ну, не то чтобы прямо пропадает - в студии ж компилится, может, и не только в ней?)
Согласно стандарта С++, каждое инстанцирование шаблона класса - это новый класс, так что в любом случае это не может быть дружбой с самим собой.
template<typename t>
some( const some<t> &a )
Вот конструктор копирования:
some( const some &a )
притом даже в шаблонном классе, если объявлять его в интерфейсной части класса.
Констурктор прикольный, это уже не конструктор копий, а просто конструктор приведения типа. Конечно может быть и удобно, но не правильно.
и в описании я указывал именно про работу с разными инстанциями.
Ебал её рука?