模糊过载访问具有可变参数的无参数模板函数

时间:2010-01-21 12:41:35

标签: c++ templates boost overloading ambiguity

是的,标题可以吓唬婴儿,但实际上非常简单。

我试图将一个函数指针存储到一个专门的模板函数,即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 = ]

如果我注释掉非变量变量,代码编译得很好。

有没有人知道解决两个无参数函数之间模糊性的正确语法?

1 个答案:

答案 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参数版本。