已忽略函数的默认模板参数
Default template argument for function ignored
template < class A, class B, class R = A >
void addMultiplyOperation( std::function< R ( const A&, const B& ) > func )
{
...
}
addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } );
这会导致编译器错误:
In function 'int main(int, char**)':
error: no matching function for call to 'addMultiplyOperation(main(int, char**)::__lambda1)'
addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } );
^
note: candidate is:
note: template<class A, class B, class R> void addMultiplyOperation(std::function<R(const A&, const B&)>)
void addMultiplyOperation( std::function< R ( const A&, const B& ) > func )
^
note: template argument deduction/substitution failed:
note: 'main(int, char**)::__lambda1' is not derived from 'std::function<R(const float&, const int&)>'
addMultiplyOperation< float, int >( []( float a, int b ) { return a * b; } );
^
尽管R
模板参数默认初始化为A
,但我必须提供第三个参数才能编译。为了使用默认模板参数,我还需要做其他事情吗?
我使用g++v4.8.1。
尽管
R
模板参数默认初始化为A
,但我必须提供第三个参数才能编译。
实际上,这与它是默认参数这一事实无关。编译器也不能推导出A
和B
。看看这个简单的例子:
template<class A>
void f(function<void(A)> f) { }
int main() {
auto lambda = [](){};
f(lambda);
}
你会认为这会非常容易,A
应该被推导为void
。但不,这是不可能的。在推导模板参数时,编译器不会考虑每个可能的模板参数组合的参数类型的构造函数。一般来说,进行这种推断是很困难的。
现在,您只需要让addMultiplyOperation
接受任何类型,并希望它是可调用的。。。
template<class Function>
void addMultiplyOperation(Function func) {
// ....
}
如有必要,有一些方法可以推断函数对象可以接受的参数类型,例如,如以下答案所述:是否可以计算lambda的参数类型和返回类型?
如果传入的对象实际上不可调用,或者参数数量错误,这将导致一些严重的编译错误。现在我不确定是否有一个好的方法来解决这个问题。C++14中的概念应该可以缓解其中的一些问题。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本