为函数调用

时间:2018-01-30 00:39:13

标签: c++ c++11 boost

我可以在调用时为模板函数指定类型吗?

#include <string>
#include <utility>
#include <boost/variant.hpp>

template <typename O, typename E, template <typename, typename> class VariantType>
VariantType<O, E> f(O o)
{
    return VariantType<O, E>{std::move(o)};
}

int main()
{
    boost::variant<int, std::string> res = 
     f<int, std::string, boost::variant<int, std::string>>(17);
}

clang报告此类错误(clang++ -Wall -std=c++11 test.cpp):

test.cpp: error: no matching function for call to 'f'
                boost::variant<int, std::string> res = f<int, std::string, boost::variant<int, std::string>>(17);
                                                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'VariantType'
VariantType<O, E> f(O o)

2 个答案:

答案 0 :(得分:4)

boost :: variant模板类模板参数列表的arity不是两个。所以,修复它,例如将template <typename, typename>更改为template <typename...>

<强> Live On Coliru

#include <string>
#include <utility>
#include <boost/variant.hpp>

template <typename O, typename E, template <typename...> class VariantType>
VariantType<O, E> f(O o)
{
    return VariantType<O, E>{std::move(o)};
}

int main()
{
    boost::variant<int, std::string> res = f<int, std::string, boost::variant>(17);
}

答案 1 :(得分:0)

你不是。将模板模板参数template <typename, typename> class VariantType声明为f的第三个模板参数意味着f的第三个模板参数应为类模板boost::variant是一个模板。 boost::variant<int, std::string>不再是模板---它是模板的专业化。