Задать вопрос
@evgeniyup

Вопрос специалистам по GCC и темплейтам C++

Вопрос специалистам по GCC и темплейтам C++. Наваял большой модуль на шаблонах, компилируется и работает на студии, но кидает кучу ошибок на GCC. Настолько много, что даже сложно понять, что именно так не нравится GCC.

Компилировать пробую этот файл.

Может кто помочь в решении ситуации или направить на путь истинный?

Спасибо.
  • Вопрос задан
  • 4880 просмотров
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 8
@egorinsk
У меня немного оффтопиковый вопрос, а зачем вы делаете файлы-то по 20000 строк? Это же наркоманство чистой воды. Сделали бы набор небольших файлов, искать ошибку в 200 строках проще, чем в 20000.
Ответ написан
@EaS
1) Обычно просят помочь на максимально уменьшенном варианте кода, дающем ошибку.
2) C++11 используете? Если да, попробуйте добавить -std=c++11 в компиляцию.
3) У вас куча ifdef'оф. Дайте лучше вывод препроцессора. Вряд ли кто-то захочет специально ради вас выкачивать ваш проект, искать команду компиляции и т.д. (пункт 1 это все равно не отменяет)
4) Сюда не пробовали заходить? Или сюда?
Ответ написан
Комментировать
@vScherba
Я в код не лазил, но по описанию ошибки понятно же все «explicit specialization in non-namespace scope». Сам раньше сталкивался. Вы где-то внутри структуры OS_FunctionClassImpConst0__cdecl специализировали шаблон. Стандартом это запрещено, специализировать шаблон можно только внутри пространства имен, в том числе и глобального. Но MSVC позволяет внутри структур/классов.
Ответ написан
@evgeniyup Автор вопроса
Вывод показать конечно можно:
c:/sources/cocos2d-os/modules/objectscript/source/objectscript.cpp(3) : from c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h(474): error : explicit specialization in non-namespace scope 'struct OS_FunctionClassImpConst0__cdecl<R, T>' c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h(475): error : template-id 'run<void>' in declaration of primary template c:/sources/cocos2d-os/modules/objectscript/source/os-binder-cc-functions.h(35) :In file included from c:/sources/cocos2d-os/modules/objectscript/source/os-binder-arg-cc-functions.h(35) : from c:/sources/cocos2d-os/modules/objectscript/source/os-binder.h(589) : from c:/sources/cocos2d-os/modules/objectscript/source/objectscript.cpp(3) : from c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h( In constructor 'OS_FunctionClassImpConst0__cdecl<R, T>) ::OS_FunctionClassImpConst0__cdecl(const char*, int)': c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h(460): error : class 'OS_FunctionClassImpConst0__cdecl<R, T>' does not have any field named 'f' c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h( In static member function 'static int OS_FunctionClassImpConst0__cdecl<R, T>) ::run(ObjectScript::OS*, int, int, int, void*)': c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h(465): error : 'OS_E_ERROR' was not declared in this scope c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h(465): error : 'OS' has not been declared c:/sources/cocos2d-os/modules/objectscript/source/os-binder-cc-functions.h(35) :In file included from c:/sources/cocos2d-os/modules/objectscript/source/os-binder-arg-cc-functions.h(35) : from c:/sources/cocos2d-os/modules/objectscript/source/os-binder.h(589) : from c:/sources/cocos2d-os/modules/objectscript/source/objectscript.cpp(3) : from c:/sources/cocos2d-os/modules/objectscript/source/os-binder-function.h(468): error : 'F' was not declared in this scope
и т.д.

Напомню, под студией проблемы нет.
Ответ написан
Комментировать
MrGobus
@MrGobus
Иван
Обычно ошибка в любом темплейте вызывает множество ошибок компиляции, так как одна моментально начинает приводить к новой новой и новой, разгребайте сверху вниз и вы будуте приятно удивленны как число ошибок начнет сокращаться в тойже прогрессии как они и образовались.
Далее голый g++ обычно ненастроен на обработек исключений ошибок и делает по своему умолчанию, таже визальная студия или code blocks при компиляции подставляют разные ключи проверки ошибок вроде -Wall и т.п. Так вот, g++
Ответ написан
WNeZRoS
@WNeZRoS
В код не особо смотрел, но у меня была подобная студия с template (в студии компилится, в gcc нет). Решилась проблема перемещением тела темплейтных методов/классов в .h файл.
Ответ написан
@evgeniyup Автор вопроса
Спасибо за помощь, ситуация решена. В сущности имелось две проблемы:

1. template <> static int run внутри шаблонного класса
2. использование __cdecl, __stdcall и т.п. — это пришлось вообще убрать для GCC, __attribute__((cdecl)) и т.п. не помогло
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Всё, что я знаю: GCC — самый «въедливый» компилятор. После Intel и Embarcadero (про M$ не знаю) на «зашаблоненном» коде GCC найдёт ещё два десятка ошибок.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы