trurle: (lem)
[personal profile] trurle
C++ подобен морю.

В STL есть класс pair:
#include <utility>
#include <iostream>

using namespace std;

int main()
{
    pair<int, float> p;
    p.first = 3;
    p.second = 4.5;
    cout << p.first << "," << p.second << endl;
}
теперь попробуем у него унаследовать.
#include <utility>
#include <iostream>

using namespace std;

template<typename T> class range : public std::pair<T,T> {
public:
    range(T v) : std::pair<T,T>(v,v) {}
    bool in(T v) { return first <= v && v <= second; }
};
Компилируется? Нет, не компилируется в gcc 4.x, а как компилируется? Вот так:
#include <utility>
#include <iostream>

using namespace std;

template<typename T> class range : public std::pair<T,T> {
public:
    range(T v) : std::pair<T,T>(v,v) {}
    bool in(T v) { return std::pair<T,T>::first <= v && 
                          v <= std::pair<T,T>::second; }
};
Мне это кажется весьма примечательным
From: [identity profile] ak-47.livejournal.com
first и second это dependent names. Для dependent names правила lookup при name resolution имеют нюансы. (См. об этом в священных книгах п. 14.6.2/3). В частности, если базовый класс зависит от параметров темплейта (а в данном примере он зависит), то unqualified name в теле наследника не будет по умолчанию разыскиваться в базовом классе.

Как уже отметили некоторые постеры, многие компалеры по доброте душевной ослабляют это требование и находят имя, даже если оно в базовом классе. Но по Стандарту требуется fully qualified имя. Пример из 14.6.2/3:
typedef double A;
template<class T> class B {
    typedef int A;
};

template<class T> struct X : B<T> {
    A a;  // a has type double
};

From: [identity profile] trurle.livejournal.com
Думаете, скоро священные книги приобретут формат Талмуда: посередине исходный текст, узкой колонкой, вокруг комментарии и дискуссии вокруг комментариев.
From: [identity profile] ak-47.livejournal.com
В качестве компенсации толкование священных книг станет почётной и уважаемой в обществе профессией.
From: [identity profile] trurle.livejournal.com
Зеленкович провел всю свою юность, изучая Письменный и Устный стандарт C++. Никто лучше него во всей округе не мог изложить на память правила множественного наследования темплейтных классов. Неудивительно что его сваха могла выбирать самые заманчивые брачные предложения...
From: [identity profile] ak-47.livejournal.com
А как красиво Зеленкович рассказывал о виртуальных функциях на еженедельных летучках перед наступлением субботы! Товарищи Зеленковича по отделу мало что понимали в его речах, но все без исключения восхищались им и сходились во мнении что Зеленкович далеко пойдёт.

И тут по округе пролетела весть о том что к старой тёте Малке из бухгалтерии приезжает сын из столицы, кандидат компьютерных наук. С женой и дочкой. Попроведовать, отдохнуть...

Женился или срезал?

Date: 2009-12-01 05:10 pm (UTC)
From: [identity profile] trurle.livejournal.com
Там дальше сюжет шолом-алейчемовский/балшевис-зингеровский или шукшинский?

Re: Женился или срезал?

Date: 2009-12-01 05:21 pm (UTC)
From: [identity profile] ak-47.livejournal.com
Сам не знаю. Направо - красивые, налево - умные. Боюсь разорваться. :)

Profile

trurle: (Default)
trurle

January 2017

S M T W T F S
1234 5 6 7
89 101112 13 14
151617181920 21
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 26th, 2025 12:16 pm
Powered by Dreamwidth Studios