У меня есть заголовок, в который я помещаю определение шаблона функции:
template <typename FT, typename std::enable_if< !std::is_array<FT>::value, int >::type =0 >
int fieldRW(lua_State* l, FT* ptr, bool write){ return scalarFieldRW<FT>(l, ptr, write); }
в блоке .cpp Я получаю указатель на эту функцию шаблона и ожидаюкомпилятор для создания шаблона:
typedef int (*_fieldRW)(lua_State*, void*, bool);
int dummy=3;
_fieldRW aFunctionPointer=_fieldRW(fieldRW<decltype(dummy)>);
Все компилируется.Но я получаю следующую ошибку времени ссылки:
/ home / pisto / sorgenti / hopmodv4 / src / fpsgame / server.cpp: 39: неопределенная ссылка на `int fieldRW (lua_State *, int *, bool) '
Обратите внимание, что компилятор правильно выбирает шаблон, определенный в заголовке (поскольку он добавляет второй аргумент шаблона по умолчанию), но, по-видимому, ему не удается создать экземпляр шаблона.
РЕДАКТИРОВАТЬ: это определенно похоже на ошибку.Смотрите эти тесты: http://pastebin.com/5Yjsv47H Кроме того, еще один признак того, что это, вероятно, ошибка в g ++, заключается в том, что если я сделаю это:
int main() {
int dummy=3;
int (*inted)(int*)=asd<decltype(dummy)>;
int (*voided)(void*)=(int (*)(void*))asd<decltype(dummy)>;
voided(&dummy);
}
g ++ предупреждает о неиспользуемой переменной inted
, нопрекрасно компилируется.