2016-03-14 4 views
1

При попытке скомпилировать одиночный тестовый файл C++ под G ++ с C++ 11 появляется следующая ошибка.Неразрешенный перегруженный тип функции при попытке передать функцию в качестве аргумента

spike/cur_spike.cpp: In function ‘int main()’: 
spike/cur_spike.cpp:60:44: error: no matching function for call to ‘callFunctionFromName(<unresolved overloaded function type>, std::__cxx11::string&)’ 
    callFunctionFromName (outputLine, param); 
              ^
spike/cur_spike.cpp:49:7: note: candidate: template<class funcT, class ... Args> funcT callFunctionFromName(funcT (*)(Args ...), Args ...) 
funcT callFunctionFromName (funcT func(Args...), Args... args) { 
    ^
spike/cur_spike.cpp:49:7: note: template argument deduction/substitution failed: 
spike/cur_spike.cpp:60:44: note: couldn't deduce template parameter ‘funcT’ 
    callFunctionFromName (outputLine, param); 
              ^

Вот код.

#include <iostream> 
#include <string> 


template <typename T> 
void outputLine (T text) { 
    std::cout << text << std::endl; 
} 

template <typename funcT> 
funcT callFunctionFromName (funcT func()) { 
    return func(); 
} 
template <typename funcT, typename... Args> 
funcT callFunctionFromName (funcT func(Args...), Args... args) { 
    return func (args...); 
} 

int main() { 
    std::string param = "Testing..."; 
    callFunctionFromName (outputLine, param); 

    return 0; 
} 

Я в настоящее время строит это на системе Linux с помощью G ++, этот фрагмент кода содержит весь код, связанный с этим вопросом. Я особенно заинтригован тем, что компилятор не смог вывести параметр шаблона funcT по какой-то причине, хотя функция outputLine имеет чистый тип возврата void.

Установка указателя outputLine с использованием void (*outputLinePtr)(std::string) = outputLine и использование указателя в качестве аргумента вместо этого ничего не делает. Любая помощь приветствуется.

ответ

1

Вы можете задать аргумент шаблона вручную.

callFunctionFromName (outputLine<std::string>, param); 
+0

Ну, э-э, это сработало. Однако я понятия не имею, почему. Можете ли вы дать мне ссылку или некоторую ссылку, которую я могу прочитать относительно синтаксиса '<>'? Я новичок в C++, так жаль по-видимому невежественному вопросу. Спасибо! –

+0

@Wintro это просто явная реализация функции. Вы говорите компилятору, что хотите использовать 'outputLine' для типа' std :: string'. – ForEveR

+0

Ага, ладно спасибо. Разве нет способа заставить его оставаться универсальным, т. Е. Если я хочу передать значение 'outputLine' через' callFunctionFromName', которое я не знал, это тип до момента прохождения? –

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