template <typename Subclass> struct B1 {
int f1() { return (*reinterpret_cast<Subclass*>(this)).i_; }
};
template <typename Subclass> struct B2 {
int f2() { return (*reinterpret_cast<Subclass*>(this)).i_; }
};
template
<
template <class> class Baseclass1 = B1,
template <class> class Baseclass2 = B2
>
class Foo : public Baseclass1<Foo<> >, public Baseclass2<Foo<> >
{
public:
Foo() : i_(123) {}
int i_;
};
Почему в vc7 только функции первого шаблонного параметра (f1) находят адреса отктрытых членов (i_) класса Foo?
... << RSDN@Home 1.0 beta 6a >>
Здравствуйте, SETA, Вы писали:
S> S> template <typename Subclass> struct B1 {
S> int f1() { return (*reinterpret_cast<Subclass*>(this)).i_; }
S> };
S> template <typename Subclass> struct B2 {
S> int f2() { return (*reinterpret_cast<Subclass*>(this)).i_; }
S> };
S>
При множественном наследовании адреса не всех подобъектов равны адресу
полного объекта. Вместо reinterpret_cast используй
static_cast.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, SETA, Вы писали:
SET> int f1() { return (*reinterpret_cast<Subclass*>(this)).i_; }
Здесь нужен static_cast, а то будут проблемы.
SET>class Foo : public Baseclass1<Foo<> >, public Baseclass2<Foo<> >
Если ты хочешь чтобы у тебя действительно был сабклассинг, то убери "<>" от Foo
— т.к. "Foo<>" означает инстанциацию шаблона с набором шаблонных аргументов по умолчанию.