调用模板函数出错

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&lt;int,int&gt; 对我的应用程序来说非常重要

【问题讨论】:

如果你不想指定转换器,那么你基本上有intT转换器(boost::any anyFunction)。但是我不禁想知道你到底想做什么,而不是如何...... 适合所有人^ 我不知道我必须为多个类型模板指定至少一种类型。 【参考方案1】:

你...忘记添加括号了:

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”出错

模板与分离编译模式

C++ 提高教程 模板-普通函数与函数模板调用规则

在 us-east-1 区域中启动给定的 cloudformation 模板时出错。 (构建 lambda 函数接收错误)

C++中函数模板和模板函数的区别

为啥具有“相同签名”的模板和非模板函数重载调用非模板函数?