2 vengel Vengel 于 2016.01.21 16:44 提问

函数类型作为模板的类型参数,could not deduce template argument for 'T' 20C

模板定义:

template <typename UnaryFunction, typename ContextAcessor>
void ForEachApplication(UnaryFunction func) {
    using namespace utils;
    typename ContextAcessor::ApplicationListAccessor accessor;
    typedef typename ContextAcessor::ApplictionSetConstIt Iter;
    for (Iter it = accessor.begin(); it != accessor.end(); ++it) {
        if (it->valid()) {
            ApplicationConstSharedPtr const_app = *it;
            func(ContextAcessor::instance()->application(const_app->app_id()));
        }
    }
}

模板调用:

void StateController::TempStateStopped(HmiState::StateID ID) {
    LOG4CXX_AUTO_TRACE(logger_);
    {
        sync_primitives::AutoLock autolock(active_states_lock_);
        active_states_.remove(ID);
    }

    ForEachApplication(std::bind1st(std::mem_fun(&StateController::ApplyPostponedStateForApp), this));
}

编译错误:

error C2783: 'void application_manager::StateController::ForEachApplication(UnaryFunction)' : could not deduce template argument for 'ContextAcessor'

编译环境:win7_x64+vs2008

请大神帮帮忙,怎么解决啊~~~

2个回答

caozhy
caozhy   Ds   Rxr 2016.01.21 16:52

说的很清楚,没办法推定类型,因为你的函数参数没有ContextAcessor,所以不知道它的类型,需要指定下
http://stackoverflow.com/questions/19221183/could-not-deduce-template-argument-for-t

Vengel
Vengel   2016.01.21 17:28

如果要指定类型,那么需要同时指定UnaryFunction和ContextAcessor的类型, ContextAcessor的类型我知道怎么指定,但是UnaryFunction的类型怎么指定?ApplyPostponedStateForApp是类StateController的**成员函数**,如何指定它作为UnaryFunction的类型?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
模板函数的参数类型不能通过表达式推导
2down votefavorite I want to implement a container which can accept initial list of elements by supplying the constructor with sequence of values. 9 template typename C, int max>
三、非类型模板参数(Nontype Template Parameters)
对于函数模板和类模板,模板参数不一定必须是类型,也可是是常规的数值。当以类型(type)作为模板参数的时候,代码中未决定的是类型;当以一般的数字(non-type)作为模板参数的时候,代码中待定的内容便是某些数值。使用者这种模板必须要显示指定数值,模板才能实例化。1、非类型类模板参数(Nontype Class Template Parameters)之前章节中的列子中Stack类中使用vector
C++ - 非类型模板参数(nontype template parameters) 使用 及 代码
非类型模板参数(nontype template parameters) 使用 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17219921 非类型模板参数(nontype template parameters), 可以使用整型类型(integral type), 指针(pointer) 或者是 引用(reference); 绑定非类型整数
c++函数模板做参数
模板分为函数模板和类模板 今天我们来说说函数模板。 一:函数模版定义形式 template 类型形式参数表为: typename T1,typenameT2,......typenameTn 或者classT1,classT2,......classTn 函数模板声明形式 template 类型 函数名(形式参数表) { 语句序列 } 函数模板
C++基础——非类型模板参数
非类型模板参看,顾名思义,模板参数不限定于类型,普通值也可作为模板参数。 1. 非类型类模板参数 2. 非类型函数模板参数 3. 非类型模板参数的限制 (1). 如何以非常量类型(double或class-type)作为非类型模板参数? (2). 如何实现对外部链接对象的引用?
关于标准库中的ptr_fun/binary_function/bind1st/bind2nd
转自:http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html 以前使用bind1st以及bind2nd很少,后来发现这两个函数还挺好玩的,于是关心上了。 在C++ Primer对于bind函数的描述如下: “ 绑定器binder通过把二元函数对象的一个实参绑定到一个特殊的值上将其转换成一元函数对象
c++无类型参数模板(non-type template parameter)
无类型的模板参数:C++的template可以传入普通的参数,和平时使用普通的函数参数有点相似,但又有很大的不同。 这种形式的模板一般是用来初始化类的数组成员的大小例如下面有的代码: template class CTest { int m_data[size]; }; void main() { CTest obj;// 将obj对象的成员 数值m_data大小初始为1
两种指定函数模板类型的方法
// filename: test.cpp #include <stdio.h>template <typename T> int a() { int j = sizeof(T); printf("T size %d\n", j); return 0; }template <typename V> int b(V v) { int j = sizeof(v); printf("V
C++泛型编程1——函数模板实例化,模板参数,重载及特化
在C++中我们都知道引入了函数重载,那么在实际应用过程中:   如果我们想要实现一个加法函数,我们可以写出很简单的代码:   int ADD(int a,int b) {   return a+b; }  上面的函数很简单,但是仔细想一下,这样就实现了加法操作嘛?当我们的实参类型为double,float时,又怎么处理加法呢?   我们可以多定义几个函数   double ADD(doubl
C++模板编程->指针及引用模板参数
//以指针为模板参数 template struct wrapper { /* data */ int get(){return *p;} void set(int v){*p=v;} }; //以引用为模板参数 template struct wrapper1 { /* data */