- 768 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 16:24:09.60 ID:4mzN2AL1.net]
- 戻り値のautoが決まらないってことでしょ?autoをdouble固定にしてReturnをなくせば通る
#include <iostream> auto sum() {return 0;} template<typename Head> auto sum(Head head) {return head;} template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);} template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);} int main( int argc, char *argv[] ) { std::cout << sum(1,2.1) << std::endl; std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl; std::cout << wrap(sum<int,double>, 1,2.1) << std::endl; std::cout << wrap(sum, 1,2.1) << std::endl; return 0; } // /usr/bin/g++ -fdiagnostics-color=always -g /home/user/cpp/autoreturn/sample.cpp -o /home/user/cpp/autoreturn/sample // /home/user/cpp/autoreturn/sample.cpp: In function ‘int main(int, char**)’: // /home/user/cpp/autoreturn/sample.cpp:10:29: error: no matching function for call to ‘wrap(<unresolved overloaded function type>, int, double)’ // 10 | std::cout << wrap(sum, 1,2.1) << std::endl; // | ^ // /home/user/cpp/autoreturn/sample.cpp:5:52: note: candidate: ‘template<class Return, class ... Args> Return wrap(Return (*)(Args ...), Args ...)’ // 5 | template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);} // | ^~~~ // /home/user/cpp/autoreturn/sample.cpp:5:52: note: template argument deduction/substitution failed: // /home/user/cpp/autoreturn/sample.cpp:10:29: note: couldn’t deduce template parameter ‘Return’ // 10 | std::cout << wrap(sum, 1,2.1) << std::endl; // | ^
|

|