- 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; // иначе ошибка - нет доступа к приватному члену
};
3.14159265 17.08.2011 20:39 # +1
RAGE!
CPPGovno 17.08.2011 21:10 # +2
вроде можно только создавать друзей для инстанцированных классов.
Что-то типа:
friend class some<int>;
friend class some<type>;
а то что выше - не скомпилируется.
Elvenfighter 17.08.2011 23:09 # +3
Kirinyale 18.08.2011 10:43 # 0
Ещё факт, что в студии, начиная, как минимум, с 2005 (более ранние не проверял), можно объявить другом собственный шаблонный аргумент:
template <typename T>
class C
{
friend T;
};
Стандарт, насколько удалось понять, это ранее запрещал по причине каких-то там неоднозначностей, но вроде бы в C++0x уже будет можно официально (пруф сейчас не найду, но упоминание такое встречал). По крайней мере, очень на это надеюсь, а то отличный паттерн пропадает... (ну, не то чтобы прямо пропадает - в студии ж компилится, может, и не только в ней?)
CPPGovno 18.08.2011 00:23 # +2
Согласно стандарта С++, каждое инстанцирование шаблона класса - это новый класс, так что в любом случае это не может быть дружбой с самим собой.
CPPGovno 18.08.2011 00:26 # −1
template<typename t>
some( const some<t> &a )
Вот конструктор копирования:
some( const some &a )
притом даже в шаблонном классе, если объявлять его в интерфейсной части класса.
lucidfox 18.08.2011 05:21 # −1
AxisPod 18.08.2011 07:46 # −1
Констурктор прикольный, это уже не конструктор копий, а просто конструктор приведения типа. Конечно может быть и удобно, но не правильно.
CPPGovno 18.08.2011 09:56 # −2
Enelar 19.08.2011 01:50 # +1
и в описании я указывал именно про работу с разными инстанциями.
Fai 18.08.2011 13:51 # +3
Ебал её рука?