【发布时间】:2020-12-13 03:09:10
【问题描述】:
我正在尝试在构造函数中使用 std::initializer_list 来接受可变数量的参数。使用非模板类它可以正常工作,但使用模板类它会产生编译错误。谁能指出我正确的方向?我的 g++ 能够使用 C++17。
#include <iostream>
#include <vector>
#include <type_traits>
#include <initializer_list>
struct Nontemplate
{
// std::initializer_list for a function taking variable number of arguments
template <class Iterator>
Nontemplate(std::initializer_list<Iterator> list) {
std::cout << "size: " << list.size() << std::endl;
for(auto it : list) {
std::cout << *it << std::endl;
}
}
};
template <class T, class TIterator>
struct Template
{
std::vector<T> vec;
Template(std::initializer_list<TIterator> list)
{
if(!std::is_same<typename std::iterator_traits<TIterator>::value_type, T>::value)
throw std::runtime_error("Iterator value type is not the expected.");
std::cout << "size: " << list.size() << std::endl;
vec.clear();
vec.reserve(list.size());
for(T val : list)
vec.push_back(val);
}
};
int main()
{
double vec[] = {0,1,2,3,4,5};
Nontemplate cls0({vec, vec+2, vec+3, vec+4}); // no problem
//Template cls1({vec, vec+2, vec+3, vec+4}); // compiling error
return 0;
}
提前致谢。
【问题讨论】:
-
您遇到了哪些编译错误?
-
@1201ProgramAlarm: 错误信息是:main.cpp:42:45: error: class template argument deduction failed: 42 |模板 cls1({vec, vec+2, vec+3, vec+4}); // 编译错误
-
你需要在 Template,?> cls1....中传递 Template Argumnets....
-
list的元素属于TIterator,而不是T。TIterator可能与T*相同也可能不同 -
@jianz
Template<double, double*>应该可以修复您的编译器错误,但这里没有模板参数推导。您可以只有一个模板参数:TIterator并以此为基础创建您的向量:std::vector<typename std::iterator_traits<TIterator>::value_type> vec;然后您不必自己为模板提供类型。另外它变成了编译时检查。
标签: c++ templates stdinitializerlist