LINUX.ORG.RU

Шаблонный класс с виртуальными функциями

 ,


0

2

Задача предельно простая. Есть класс вида:

template <class T>
class TableModel : public QAbstractTableModel
{
    // ...

    // Это виртуальный метод.
    int rowCount(const QModelIndex &parent = QModelIndex()) const { // ... }
}

Всё работало прекрасно, пока я не решил прогнать код через clang с доп. проверками.

Он мне выдал следующее:

warning: 'TableModel' has no out-of-line virtual method definitions; its vtable 
will be emitted in every translation unit [-Wweak-vtables]

То есть нужно перенести реализацию виртуальных методов в cpp. Но я не могу это сделать в шаблонном классе.

Как быть?

★★★★★

Ответ на: комментарий от eao197

А зачем мне его подавлять, если я сам его включил? Оно раздувает бинарь лишним мусором. Хочу этого избежать.

RazrFalcon ★★★★★
() автор топика

Лол :-) Создай родительский класс TableModelBase, унаследованный от QAbstractTableModel и реализуй виртуальную функцию там :-)

anonymous
()
Ответ на: комментарий от anonymous

А вот и смайлодаун припёрся. Ну и как мне в TableModelBase получить доступ к данным? Правильно - никак.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Ну и как мне в TableModelBase получить доступ к данным? Правильно - никак.

Откуда кто знает к каким данным ты там доступ хочешь получать? :-) Вообще-то есть такой тип, как void * :-)

anonymous
()
Ответ на: комментарий от RazrFalcon

Почитайте объяснение на StackOverflow. Раздувается объектник, т.к. компилятор вынужден генерировать vtable в каждой единице трансляции. Потом тратиться больше времени при линковке, т.к. линкеру нужно будет обнаружить все дубликаты и устранить их.

При чем здесь результирующий бинарник?

eao197 ★★★★★
()

its vtable will be emitted in every translation unit

Ну и ещё есть такая фишка в цепепе, как явное инстанцирование шаблона :-) Возьми в каком-либо .cpp явно проинстанцируй для каждого T и слинкуй :-) Как раз для этого явное инстанцирование и придумали :-) Лол :-)

anonymous
()
Ответ на: комментарий от RazrFalcon

eao197 тебе верно говорит. Бинарь не раздувается. раздуваются объектники. Обычно этот варнинг просто давлю.

anonymous
()
Ответ на: комментарий от eao197

Действительно не влияет. С чем-то попутал.

RazrFalcon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.