2011-12-27 3 views
2

Я создал шаблон функции, которая позволяет мне получить данные для любого типа данных, но я получаю сообщение об ошибке при компиляциишаблона функции связывания ошибка

Undefined symbols for architecture i386: 
    "bool Json::getData<double>(double, Json&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, DataType)", referenced from: 
     Coupon::initCoupon(int const&, Json&)in libkuapay.a(Coupon.o) 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
scons: *** [kuaposgw] Error 1 
scons: building terminated because of errors. 

функция объявлена ​​как:

template < class T> static bool getData(T data, Json &jsonObject, const string &key, DataType dataType); 

и называется:

Json::getData (couponList[cpnCnt].discount, couponReader, "discount", realType); 

где couponList[cpnCnt].discount является двойной.

Сам код компилируется в моем «внутреннем» каталоге, но я получаю сообщение об ошибке выше в «внешнем» каталоге , где последний по существу является оберткой внутреннего кода.

+0

Вы можете включать в себя определение функции? Ошибка говорит о том, что с ней что-то не так. – kichik

+1

'ld' - это компоновщик, а не компилятор. Поэтому, когда он жалуется, это означает, что у вас есть ошибка компоновщика, а не ошибка компилятора. – Omnifarious

ответ

2

Текущее состояние шаблонов обычно требует наличия определения функции прямо там, где у вас есть объявление функции.

Как работают шаблоны, компилятор в основном производит пользовательскую версию вашей функции для каждого варианта аргументов шаблона. Поскольку компилятор не может заранее знать, что будут все эти разные аргументы шаблона (будет ли это int или double или какой-либо неизвестный тип, который был объявлен в каком-либо другом файле?), Он не может создавать эти версии до тех пор, пока не будет вызвана функция.

Это означает, что при вызове функции все функции должны быть доступны компилятору. Чтобы это произошло, вы должны поместить определение функции в заголовок.

Есть и другие способы сделать это. Явное создание экземпляров для шаблонов классов. Объявление перегрузки, в которой нет аргументов шаблона для функции. Но в целом ваше определение всего шаблона должно быть в файле заголовка.

+0

Привет, спасибо за ответ, я попробую добавить определение функции в заголовок. В то же время, вот определение: – jdeckman

+0

шаблон BOOL Json :: GetData (данные T, Json & JSONObject, сопзЬ строку & ключ, DataType DATATYPE) { если (! JsonObject.hasKey (ключ)) вернуться ложным; if (jsonObject.value (ключ) == json_spirit :: null_type) return false; , если (Datatype == realType) { , если (jsonObject.value (ключ) .type() == json_spirit :: str_type) данные = NumberParser :: parseFloat (jsonObject.value (ключ) .get_str()) ; else data = jsonObject.value (ключ).get_real(); } возвращающие } – jdeckman

+0

@ user1118089:. Ну, это выглядит нормально, хотя было бы лучше, если вы обновили свой вопрос с определением и сказать, какой файл это в – Omnifarious

0

Шаблоны не создаются автоматически на C++, а используются, если они явно или явно не используются. Вы можете запустить первый случай, используя функцию, когда экземпляр шаблона доступен при использовании шаблона (например, поместив его в файл заголовка), например, @Omnifarious.

В качестве альтернативы, вы можете сделать функцию не- static и явно его экземпляр в исходном файле:

template bool getData<double>(double data, Json &jsonObject, const string &key, DataType dataType); 
+0

Большое спасибо! – jdeckman

Смежные вопросы