调用模板函数出错
Posted
技术标签:
【中文标题】调用模板函数出错【英文标题】:Error in calling template function 【发布时间】:2016-04-21 12:13:46 【问题描述】:我开始使用boost::any
,我正在尝试定义一个函数,它给定boost::any
参数(最初是std::function
对象)将其转换回std::function
。
#include <iostream>
#include <functional>
#include <boost/any.hpp>
using namespace std;
typedef function<int(int)> intT;
template <typename ReturnType, typename... Args>
std::function<ReturnType(Args...)> converter( boost::any anyFunction)
return boost::any_cast<function<ReturnType(Args...)>> (anyFunction);
int main()
intT f = [](int i) return i; ;
boost::any anyFunction = f;
try
intT fun = boost::any_cast<intT>(anyFunction);//OK!
fun = converter(anyFunction);//ERROR!
catch (const boost::bad_any_cast &)
cout << "Bad cast" << endl;
这是返回的错误:
1>c:\users\llovagnini\source\repos\cloudcache\cloudcache\cloudcache\memoization.cpp(9): error C2146: syntax error: missing ';' before identifier 'anyFunction'
1> c:\users\llovagnini\source\repos\cloudcache\cloudcache\cloudcache\helloworld.cpp(16): note: see reference to function template instantiation 'std::function<int (void)> converter<int,>(boost::any)' being compiled
1>c:\users\llovagnini\source\repos\cloudcache\cloudcache\cloudcache\memoization.cpp(9): error C2563: mismatch in formal parameter list
1>c:\users\llovagnini\source\repos\cloudcache\cloudcache\cloudcache\memoization.cpp(9): error C2298: missing call to bound pointer to member function
你能帮我理解我哪里错了吗?
更新
我解决了括号问题,但知道编译器会抱怨,因为我在没有指定任何类型的情况下调用converter
...有什么方法可以让它保持通用?不指定converter<int,int>
对我的应用程序来说非常重要
【问题讨论】:
如果你不想指定转换器你...忘记添加括号了:
return boost::any_cast<std::function<ReturnType(Args...)> >(anyFunction);
接下来,你不能推导出模板参数,所以你必须指定它们:
fun = converter<int, int>(anyFunction);
Live On Coliru
#include <iostream>
#include <functional>
#include <boost/any.hpp>
typedef std::function<int(int)> intT;
template <typename ReturnType, typename... Args>
std::function<ReturnType(Args...)> converter(boost::any anyFunction)
return boost::any_cast<std::function<ReturnType(Args...)> >(anyFunction);
int main()
intT f = [](int i) return i; ;
boost::any anyFunction = f;
try
intT fun = boost::any_cast<intT>(anyFunction); // OK!
fun = converter<int, int>(anyFunction); // OK!
catch (const boost::bad_any_cast &)
std::cout << "Bad cast" << std::endl;
【讨论】:
同时更新:D【参考方案2】:converter
是一个函数模板,但没有一个模板参数在推导出的上下文中,因此您必须显式提供它们:
fun = converter<int,int>(anyFunction);
否则就无法知道要调用哪个converter
。
【讨论】:
以上是关于调用模板函数出错的主要内容,如果未能解决你的问题,请参考以下文章
在 azure 上部署 cloudera 失败,JSON / ARM 模板函数“copyIndex”出错
在 us-east-1 区域中启动给定的 cloudformation 模板时出错。 (构建 lambda 函数接收错误)