Форум русскоязычного сообщества Ubuntu


Автор Тема: Странное поведение шаблонов в C++  (Прочитано 2513 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Thread

  • Автор темы
  • Гость
Странное поведение шаблонов в C++
« : 02 Декабрь 2007, 18:21:10 »
Понимаю, что вопрос к убунту не относится, однако в описании раздела форума стоит "Всё, что касается программирования", поэтому... :)

Есть нечто такое (всё лишнее убрал):
#include <vector>

template<typename T> class Container
{
    public:
        ~Container() throw ();
    protected:
        std::vector<T *> arr;
};

template<typename T> Container<T>::~Container() throw ()
{
    if (this->arr.empty())
        return;
    for (std::vector<T *>::iterator i = this->arr.begin(); i < this->arr.end(); i++)
        <чегототам>;
}

При компиляции (gcc 4:4.1.2-9ubuntu2) получаем
core.cpp: In destructor 'Vertex::Container<T>::~Container()':
core.cpp:495: error: expected `;' before 'i'
core.cpp:495: error: 'i' was not declared in this scope
495 строка - это строка с for( ; ; )

Если в этой строке поменять T * на int, то компилируется.

Вопрос стандартный: wtf? o_O

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #1 : 02 Декабрь 2007, 22:46:15 »
template < typename T > class super
{
...
typedef typename std::vector<T *>::iterator cont_it;
...
void method()
{
  for( con_it i = arr.begin(); i != arr.end(); ++i )
  ...
}
...
};
?

Thread

  • Автор темы
  • Гость
Re: Странное поведение шаблонов в C++
« Ответ #2 : 03 Декабрь 2007, 00:17:45 »
Перед "std::vector<T *>::iterator i" воткнул typename. Скомпилилось, спасибо. Однако естественным образом возникает вопрос - почему?

UPD: скурил. Помогло это: http://womble.decadentplace.org.uk/c++/template-faq.html#disambiguation. Цель этой фишки в том, чтобы явно отличить тип параметризованного шаблона от типа непараметризованного шаблона.
« Последнее редактирование: 03 Декабрь 2007, 00:28:29 от a-v »

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #3 : 03 Декабрь 2007, 00:53:16 »
Долго втыкал, почему такую ошибку он выдал, но до сих пор не понимаю. Там видимо компилятору серьёзно крышу сносит. Не понятно, чем может помочь точка с запятой перед i.

Кстати, в таких циклах лучше проверять на неравенство с помощью !=, и использовать префиксный ++.

Thread

  • Автор темы
  • Гость
Re: Странное поведение шаблонов в C++
« Ответ #4 : 03 Декабрь 2007, 16:26:25 »
Про точку с запятой думаю, что имеется в виду первая точка с запятой в конструкции for ( ; ; ); (ошибочный операнд пропускается, получается for (i; ...), а i - неизвестно что).

Про != понятно, а почему именно префиксный ++? Ведь для итераторов в STL определены оба.

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #5 : 03 Декабрь 2007, 16:54:56 »
Префиксный потому, что семантически постфиксный определён через префиксный и как результат должен возвращать предыдущее значение, то есть присутствует скрытое создание временного объекта.

То есть что-то типа
class A {
...
// префиксный
const A& A::operator++()
{
    this->do_inc(); // супер-метод
    return *this;
}

// постфиксный
const A A::operator++(int)
{
    A temp(*this);
    ++(*this); // собственно инкремент
    return temp;
}
...
private:
  do_inc();
...
};
На встроенных типах разница - копейки, при переопеределении операций и использовании "тяжёлых" классов всё будет зависеть от компилятора и качества его оптимизатора.

Thread

  • Автор темы
  • Гость
Re: Странное поведение шаблонов в C++
« Ответ #6 : 03 Декабрь 2007, 17:03:09 »
Уговорил.

Оффлайн shans

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #7 : 12 Декабрь 2007, 21:59:28 »
Блин, а у меня почкму-то gcc не поддерживает реализацию шаблонных функций в cpp, ключевого слово export у него говорит нет, или вы при использовании еще #include MyClass.cpp пишите????

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #8 : 12 Декабрь 2007, 22:39:36 »
shans
Шаблоны пишутся полностью в заголовочных файлах, которые соответственно целиком включаются в исходный код.

Thread

  • Автор темы
  • Гость
Re: Странное поведение шаблонов в C++
« Ответ #9 : 13 Декабрь 2007, 01:51:47 »
Я тоже с этим стулкнулся, когда начал активно использовать шаблоны, и это разрушило моё сишное представление о том, что код всегда в .c, а объявления - всегда в .h. Сейчас я решаю проблему так: в конце заголовочного файла со всеми объявлениями шаблонов приписываю #include "implementation.inl", а файл implementation.inl рассматриваю как обычный .cpp.

Оффлайн shans

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #10 : 13 Декабрь 2007, 23:44:07 »
А какие компиляторы поддерживают не в курсе? Читал просто у Липпмана, что такие в природе водятся:)
a-v
Да, и еще это разрушило мое представление о с++ как об объектно ориентированном языке. Где единство свойств и методов???:))

Thread

  • Автор темы
  • Гость
Re: Странное поведение шаблонов в C++
« Ответ #11 : 14 Декабрь 2007, 00:17:30 »
А какие компиляторы поддерживают не в курсе? Читал просто у Липпмана, что такие в природе водятся:)

Если компилятор работает согласно стандарту, то в .cpp в общем случае шаблоны нельзя реализовывать.

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #12 : 14 Декабрь 2007, 02:25:26 »
Да, и еще это разрушило мое представление о с++ как об объектно ориентированном языке. Где единство свойств и методов???:))
А это-то тут каким боком? Причём тут ОО в любом виде? Сам по себе язык С++ не является объектно-ориентированным. Он лишь позволяет программистам, его использующим, использовать ОО-парадигму. А писать ты на нём можешь, как душе угодно, хоть функционально, хоть в рамках ООП или мешать всё в кучу.

Оффлайн shans

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #13 : 16 Декабрь 2007, 23:19:07 »
2a-V
Точно, не помню, но там по-моему было export - есть в стандарте какого-то года:)
2Kwah
Согласен, я про это и говорю, что не является объектно ориентированным. До этого думал по другому:)   

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: Странное поведение шаблонов в C++
« Ответ #14 : 16 Декабрь 2007, 23:24:05 »
2a-V
Точно, не помню, но там по-моему было export - есть в стандарте какого-то года:)
ЕМНИП, этот самый export так и остался в стандарте, ибо очень тяжело реализовать.

 

Страница сгенерирована за 0.058 секунд. Запросов: 24.