2

是的,标题可能会吓到婴儿,但实际上很简单。

我正在尝试存储一个指向专用模板函数的函数指针,即 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 = ]

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

有谁知道解决像这样的两个无参数函数之间的歧义的正确语法?

4

1 回答 1

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),您将获得 0 参数版本的make_shared().

于 2010-01-21T13:02:10.163 回答