在下面的代码中,我试图用它作为参数的任何参数来调用仿函数,“whatever”是一组有限的选项(这里的两个不是我的代码中唯一的选项)。
#include <memory>
#include <iostream>
template<class T>
struct call_with_pointer {
// last resort: T*
template<class Callable>
static auto call(Callable &callable, const std::shared_ptr<T> ¶m) -> decltype(callable(param.get())) {
return callable(param.get());
}
};
template<class T>
struct call_with_shared : public call_with_pointer<T> {
// best: call with shared_ptr<T>.
// SFINA
// error: Candidate template ignored: substitution failure [with Callable = Test]: no matching function for call to object of type 'Test'
template<class Callable>
static auto call(Callable &callable, const std::shared_ptr<T> ¶m) -> decltype(callable(param)) {
return callable(param);
}
using call_with_pointer<T>::call;
};
class Test {
public:
bool operator () (int * x) {
return *x == 42;
}
};
int main ()
{
Test t;
auto i = std::make_shared<int>(4);
auto x = call_with_shared<int>::call(t, i); // No matching function for call to 'call'
return 0;
}
此代码在 VS 和GCC中运行良好。不幸的是,它没有叮当声。错误信息是:
呼叫“呼叫”没有匹配的功能
候选模板被忽略:替换失败 [with Callable = Test]:没有匹配的函数调用类型为“Test”的对象
所以它忽略了使用智能指针的候选者。好的。但它似乎并没有继续考虑可以正常工作的继承调用。
问题:我该如何解决这个问题?我怎样才能让 llvm 在这里做正确的事情?