是的,标题可能会吓到婴儿,但实际上很简单。
我正在尝试存储一个指向专用模板函数的函数指针,即 boost::make_shared (boost 1.41),如图所示:
boost::shared_ptr<int> (*pt2Function)() = boost::make_shared<int>;
但是,它不会编译(GCC 4.4.1),因为 boost::make_shared 具有以下两个特化,编译器在这种情况下无法区分:
template< class T > boost::shared_ptr< T > make_shared()
...
template< class T, class... Args > boost::shared_ptr< T > make_shared( Args && ... args )
错误,供参考:
In function ‘int main()’:
error: converting overloaded function ‘make_shared’ to type ‘class boost::shared_ptr<int> (*)()’ is ambiguous
boost/smart_ptr/make_shared.hpp:100: error: candidates are: boost::shared_ptr<X> boost::make_shared() [with T = int]
boost/smart_ptr/make_shared.hpp:138: error: boost::shared_ptr<X> boost::make_shared(Args&& ...) [with T = int, Args = ]
如果我注释掉非可变变量,代码编译得很好。
有谁知道解决像这样的两个无参数函数之间的歧义的正确语法?