Морские рассказы
Dec. 1st, 2009 05:01 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
C++ подобен морю.
В STL есть класс pair:
В 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; } };Мне это кажется весьма примечательным
no subject
Date: 2009-12-01 03:23 pm (UTC)no subject
Date: 2009-12-01 03:41 pm (UTC)Студиозиусы Вагнер и Кох.
и в чем шутка?
Date: 2009-12-01 03:39 pm (UTC)first и second это не просто свойства,
а параметризированные параметры шаблона
имеют тип в зависимости от того с какими типами шаблон инстанциируется
кроме того, разрешены ведь и обычные first и second
например если вы таковые решите добавить в ваш шаблон, например вот так
template class range : public std::pair
first и second это не просто свойства,
а параметризированные параметры шаблона
имеют тип в зависимости от того с какими типами шаблон инстанциируется
кроме того, разрешены ведь и обычные first и second
например если вы таковые решите добавить в ваш шаблон, например вот так
template<typename T> class range : public std::pair<T,T> {
int first;
int second;
public:
...
Re: и в чем шутка?
Date: 2009-12-01 03:40 pm (UTC)Re: и в чем шутка?
Date: 2009-12-01 03:59 pm (UTC)С++ у нас ведь сильно типизированный, не так ли?
и ничуть не затеняю, какраз в виду использования полного квалификатора (другое дело, поймет ли это компилятор).
Re: и в чем шутка?
Date: 2009-12-01 03:59 pm (UTC)Известен, разумеется, это тип T.
Re: и в чем шутка?
Date: 2011-03-10 11:09 am (UTC)template <> class pair<Foo,Foo> {}</pre> без полей first и second и тогда компиляция range<Foo> повиснет в воздухе.
Re: и в чем шутка?
Date: 2009-12-02 02:10 am (UTC)no subject
Date: 2009-12-01 03:51 pm (UTC)#include
#include
using namespace std;
template class range : public std::pair
<code>
#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; }
};
int main()
{
range<int> A(5);
std::cout << A.first<< std::endl;
A.second = 100;
if ( A.in(10))
{
std::cout << A.second<< std::endl;
}
return 0;}
</code>
~/cpp > CC p.cxx
~/cpp > ./a.out
5
100
no subject
Date: 2009-12-01 04:27 pm (UTC)Раз он в море закинул невод...
Date: 2009-12-01 04:25 pm (UTC)Как уже отметили некоторые постеры, многие компалеры по доброте душевной ослабляют это требование и находят имя, даже если оно в базовом классе. Но по Стандарту требуется fully qualified имя. Пример из 14.6.2/3:
Re: Раз он в море закинул невод...
Date: 2009-12-01 04:37 pm (UTC)Re: Раз он в море закинул невод...
Date: 2009-12-01 04:44 pm (UTC)Письменный и Устный стандарт C++.
Date: 2009-12-01 04:48 pm (UTC)Re: Письменный и Устный стандарт C++.
Date: 2009-12-01 05:06 pm (UTC)И тут по округе пролетела весть о том что к старой тёте Малке из бухгалтерии приезжает сын из столицы, кандидат компьютерных наук. С женой и дочкой. Попроведовать, отдохнуть...
Женился или срезал?
Date: 2009-12-01 05:10 pm (UTC)Re: Женился или срезал?
Date: 2009-12-01 05:21 pm (UTC)no subject
Date: 2009-12-01 09:18 pm (UTC)no subject
Date: 2009-12-02 12:28 pm (UTC)