#include <stdio.h>
template<typename T>
class Base
{
public:
void BaseMethod()
{
static_cast<T*>(this)->DerivedMethod2();
}
};
class Derived : private Base<Derived>
{
public:
void DerivedMethod1()
{
BaseMethod();
}
void DerivedMethod2()
{
printf("here\n");
}
private:
friend Base<Derived>; //Line 27: error: a class-key must be used when declaring a friend
};
int main()
{
Derived d;
d.DerivedMethod1();
}
(на codepad.org)
Ну если ты хочешь, чтобы все ф-ции другого класса были друзьями, то надо писать
friend class имя_класса:
friend class Base<Derived>;
Причём не обязательно в секции private
... << RSDN@Home 1.2.0 alpha 4 rev. 1324>>
Здравствуйте, ArtDenis, Вы писали:
AD>Ну если ты хочешь, чтобы все ф-ции другого класса были друзьями, то надо писать friend class имя_класса:
AD>AD>friend class Base<Derived>;
AD>
Интересно, а VC8, VC9 и Comeau online компилируют. Получается, в них баг?
AD>Причём не обязательно в секции private
Так просто воспринимается лучше.
См. C++03 — 11.4/2, 7.1.5.3/1. По правилам C++0x такой код корректен — см. N3000 — 11.4/3. Я бы привёл цитаты, но глючный форум не позволяет мне отправлять длинные посты.
В Comeau ты можешь выставить опцию "Disable C++0x extensions" и сравнить результат.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>См. C++03 — 11.4/2, 7.1.5.3/1. По правилам C++0x такой код корректен — см. N3000 — 11.4/3. Я бы привёл цитаты, но глючный форум не позволяет мне отправлять длинные посты.
Ты что, весь текст стандарта хотел процитировать?

Никогда ещё не возникало проблем с цитатами.

... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>