У меня есть заголовок, где я поставил определение шаблона функции:шаблона ссылки ошибки
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: undefined reference to `int fieldRW(lua_State*, int*, bool)'
Обратите внимание, что компилятор правильно выбирает шаблон, определенный в заголовке (потому что он добавляет по умолчанию второго аргумента шаблона), но, видимо, не в состоянии на самом деле создать экземпляр шаблон.
EDIT: Это выглядит определенно как ошибка. Смотрите эти тесты: http://pastebin.com/5Yjsv47H Кроме того, еще один признак того, что это, вероятно, будет ошибкой в г ++ является то, что если я делаю это:
int main() {
int dummy=3;
int (*inted)(int*)=asd<decltype(dummy)>;
int (*voided)(void*)=(int (*)(void*))asd<decltype(dummy)>;
voided(&dummy);
}
г ++ предупреждает о неиспользуемой переменной inted
но компилирует мелко.
является тип парам 'FT *' должен быть 'недействительным *' или ' int * '? Кажется, что ваш код и ошибка компоновщика не согласуются. – Useless
Я ожидаю, что последняя строка второго фрагмента кода создаст функцию fieldRW с FT = int. Не имеет значения, если тогда я передам функцию другому типу функции, это только для полноты моего примера. –
Ну ладно, кастинг на другой тип указателя функции (который чувствует себя как-то необычайно, что-то делать) бросил меня. У меня нет стандартной возможности проверять правила экземпляра шаблона шаблона, схожего кто-то еще делает ... – Useless