trurle: (lem)
trurle ([personal profile] trurle) wrote2009-12-01 05:01 pm

Морские рассказы

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; }
};
Мне это кажется весьма примечательным

Re: и в чем шутка?

[identity profile] trurle.livejournal.com 2009-12-01 03:40 pm (UTC)(link)
В Вашем примере Вы затеняете поля суперкласса полями наследуемого класса. По прежнему не вполне ясно почему обращение к полям суперкласса должно идти с полным квалификатором.

Re: и в чем шутка?

[identity profile] gineer.livejournal.com 2009-12-01 03:59 pm (UTC)(link)
потому что для шаблонных first и second неизвестен их тип, как я понимаю
С++ у нас ведь сильно типизированный, не так ли?
и ничуть не затеняю, какраз в виду использования полного квалификатора (другое дело, поймет ли это компилятор).

Re: и в чем шутка?

[identity profile] trurle.livejournal.com 2009-12-01 03:59 pm (UTC)(link)
потому что для шаблонных first и second неизвестен их тип, как я понимаю
Известен, разумеется, это тип T.

Re: и в чем шутка?

[identity profile] oblomov-jerusal.livejournal.com 2011-03-10 11:09 am (UTC)(link)
У pair может быть явная специализация
template <> class pair
[Error: Irreparable invalid markup ('<foo,foo>') in entry. Owner must fix manually. Raw contents below.]

У pair может быть явная специализация<pre>
template <> class pair<Foo,Foo> {}</pre> без полей first и second и тогда компиляция range<Foo> повиснет в воздухе.
nine_k: A stream of colors expanding from brain (Default)

Re: и в чем шутка?

[personal profile] nine_k 2009-12-02 02:10 am (UTC)(link)
Это в яве есть type erasure. В C++ вроде бы тип 100% известен.