是的,标题可以吓唬婴儿,但实际上非常简单。
我试图将一个函数指针存储到一个专门的模板函数,即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 = ]
如果我注释掉非变量变量,代码编译得很好。
有没有人知道解决两个无参数函数之间模糊性的正确语法?
答案 0 :(得分:2)
可变参数模板参数意味着你可以使用 0..n 模板参数,因此你的两个版本都是匹配的。
您可以通过向第二个版本添加另一个模板参数来解决歧义,以便它需要 1..n 参数。
这样的事情应该有效:
template< class T, class Arg1, class... Args >
boost::shared_ptr< T > make_shared(Arg1&& arg1, Args && ... args )
但正如UncleBens正确指出的那样,你甚至不需要两个版本。在您的情况下,以下内容应该足够了:
template< class T, class... Args >
boost::shared_ptr<T> make_shared(Args && ... args );
如果只使用一个模板参数(即T
),则会获得make_shared()
的0参数版本。