This question already has answers here:
Where and why do I have to put the “template” and “typename” keywords?
(6个答案)
6年前关闭。
我有这种奇怪的行为(对我来说),我无法解释,希望对此发表您的评论,请看以下代码:
调用“目标”时,我需要指定要使用的目标,否则会出现此编译错误:
这对我来说是可以理解的,我想我可以通过准备这么小的“助手”来避免每次指定我想要的“目标”功能:
这看起来是一个合理的解决方案(对我:)),但不起作用:
好吧,这里我没有捕获问题,为什么无效?即使我使用void(worker *)代替T,仍然存在编译错误:
我之前在'detach'函数中使用过void(worker *)没问题,为什么这里不起作用?在这种情况下,模板类型推导和函数调用解析的表现如何?
谢谢你的帮助
(6个答案)
6年前关闭。
我有这种奇怪的行为(对我来说),我无法解释,希望对此发表您的评论,请看以下代码:
void detach(callback_function_ptr const& ptr) {
observers.erase(remove_if(
observers.begin(),
observers.end(),
[&ptr](callback_function_ptr const& ptr2) {
return ptr.target<void(worker*)>() == ptr2.target<void(worker*)>();
}
));
}
调用“目标”时,我需要指定要使用的目标,否则会出现此编译错误:
test.cpp:47:44: error: no matching function for call to 'std::function<void(worker*)>::target() const'
这对我来说是可以理解的,我想我可以通过准备这么小的“助手”来避免每次指定我想要的“目标”功能:
template<typename T>
worker_ptr get_target(const function<T>& callback) {
return callback.target<T>();
}
这看起来是一个合理的解决方案(对我:)),但不起作用:
test.cpp: In member function 'void (worker::* worker::get_target(const std::func
tion<T>&))(worker*)':
test.cpp:18:27: error: expected primary-expression before '>' token
return callback.target<T>();
^
test.cpp:18:29: error: expected primary-expression before ')' token
return callback.target<T>();
^
好吧,这里我没有捕获问题,为什么无效?即使我使用void(worker *)代替T,仍然存在编译错误:
test.cpp:18:26: error: expected primary-expression before 'void'
return callback.target<void(worker*)>();
^
test.cpp:18:26: error: expected ';' before 'void'
test.cpp:18:26: error: expected primary-expression before 'void'
test.cpp:18:26: error: expected ';' before 'void'
我之前在'detach'函数中使用过void(worker *)没问题,为什么这里不起作用?在这种情况下,模板类型推导和函数调用解析的表现如何?
谢谢你的帮助
最佳答案
应该是(带有额外的template
):
template<typename T>
worker_ptr get_target(const function<T>& callback)
{
return callback.template target<T>();
}
关于c++ - 模板推导,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24009012/
10-11 22:35