gpt4 book ai didi

c++ - 无法推断 'TYPE' 的模板参数

转载 作者:太空狗 更新时间:2023-10-29 21:24:12 24 4
gpt4 key购买 nike

我有以下工作正常的代码:

list <Politician> MakeList ( int num, ... ){
va_list arguments;
va_start ( arguments, num );
list <Politician> PoliticianList;
for ( int x = 0; x < num; x++ ) {
PoliticianList.push_back(va_arg (arguments, Politician));
}
va_end ( arguments );

return PoliticianList;
}

但是,在尝试使其通用时:

template<class TYPE>
list <TYPE> MakeList ( int num, ... ){
va_list arguments;
va_start ( arguments, num );
list <TYPE> PoliticianList;
for ( int x = 0; x < num; x++ ) {
PoliticianList.push_back(va_arg (arguments, TYPE));
}
va_end ( arguments );

return PoliticianList;
}

编译时出现如下错误:

error C2783: 'std::list<TYPE> MakeList(int,...)' : could not deduce template argument for 'TYPE'

我怎样才能使它通用,这样我就不必为不同的类对象重新实现?

最佳答案

在调用MakeList 的模板化版本时,您需要显式地为TYPE 提供模板参数,因为编译器不知道,仅基于您提供的参数提供 TYPE 应该是什么。例如,给定以下调用:

MakeList<Politician>(3, politician1, politician2, politician3)

编译器无法推断出TYPE 是什么。如果您期望它足够聪明并推断出您正在传递类型为 Politician 的对象作为参数,那么那是行不通的:C 风格的可变参数函数根本不在编译时提供该信息.

但是,在 C++11 中,您可以为此目的使用可变参数模板,除其他事项外,它还允许您将后续参数的数量传递为第一个参数。这是一种重写可变参数 MakeList() 的可能方法:

namespace detail
{
template<typename T>
void MakeList(std::list<typename std::remove_reference<T>::type>& l, T&& elem)
{
l.push_back(std::forward<T>(elem));
}

template<typename T, typename... Ts>
void MakeList(
std::list<typename std::remove_reference<T>::type>& l,
T&& elem, Ts&&... elems)
{
l.push_back(std::forward<T>(elem));
MakeList(l, std::forward<Ts>(elems)...);
}
}

template<typename T, typename... Ts>
std::list<typename std::remove_reference<T>::type> MakeList(
T&& elem, Ts&&... elems)
{
std::list<typename std::remove_reference<T>::type> l;
detail::MakeList(l, std::forward<T>(elem), std::forward<Ts>(elems)...);
return l;
}

然后你可以这样使用它:

int main()
{
Politician p1{"John", "Smith"};
Politician p2{"Mike", "Black"};
Politician p3{"George", "White"};

std::list<Politician> myList = MakeList(p1, p2, p3);

for (auto const& p : myList)
{
std::cout << p.name << " " << p.surname << std::endl;
}
}

这是一个live example .

关于c++ - 无法推断 'TYPE' 的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com