然而,这与2011年提出的Template specialization with variadic templates类似,得到的答案是编译器的不完全支持。
考虑以下代码
#include <iostream>
template< typename resource >
struct smart_ref{};
template< class resource, class linked, class... arg_types >
smart_ref< resource > make_smart( linked const& lnk, arg_types&&... args )
{
return smart_ref< resource >{};
}
struct image
{
struct linked {};
};
template<>
smart_ref< image > make_smart< image, image::linked, int const >( image::linked const& lnk, int const arg )
{
return smart_ref< image >{};
}
int main()
{
//auto img = make_smart< image >( image::linked{}, 2 );
return 0;
}上面的代码给出了以下错误
$g++ -o main *.cpp
main.cpp:20:20: error: template-id ‘make_smart<image, image::linked, const int>’ for ‘smart_ref<image> make_smart(const image::linked&, int)’ does not match any template declaration
smart_ref< image > make_smart< image, image::linked, int const >( image::linked const& lnk, int const arg )
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:9:23: note: candidate is: template<class resource, class linked, class ... arg_types> smart_ref<resource> make_smart(const linked&, arg_types&& ...)
smart_ref< resource > make_smart( linked const& lnk, arg_types&&... args )
^~~~~~~~~~在模板专门化方面,我也尝试过make_smart(...)、make_smart< image >(...)和make_smart< image, image::linked >,但它仍然给出上述错误。在这种情况下,模板专门化的正确语法是什么?
发布于 2021-05-16 19:58:50
专门化必须与模板声明完全匹配,即arg参数必须为int && arg而不是int const arg
https://stackoverflow.com/questions/67554307
复制相似问题