C++ std::初始值设定项\u列表作为模板类中的构造函数参数
我试图在构造函数中使用std::initializer\u list来接受可变数量的参数。对于非模板类,它可以正常工作,但对于模板类,它会导致编译错误。谁能给我指出正确的方向?我的g++能够使用C++17C++ std::初始值设定项\u列表作为模板类中的构造函数参数,c++,templates,stdinitializerlist,C++,Templates,Stdinitializerlist,我试图在构造函数中使用std::initializer\u list来接受可变数量的参数。对于非模板类,它可以正常工作,但对于模板类,它会导致编译错误。谁能给我指出正确的方向?我的g++能够使用C++17 #include <iostream> #include <vector> #include <type_traits> #include <initializer_list> struct Nontemplate { // std::
#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;
}
#包括
#包括
#包括
#包括
结构非模板
{
//采用可变参数数的函数的初始值设定项列表
模板
非模板(std::初始值设定项\u列表){
std::cout模板cls1({vec,vec+2,vec+3,vec+4})
无法推断T
你可以用
模板cls1({vec,vec+2,vec+3,vec+4});
或提供自定义扣除指南:
template <typename It>
Template(std::initializer_list<It>)
-> Template<typename std::iterator_traits<It>::value_type, It>;
您得到的编译错误是什么?@1201programalam:错误消息是:main.cpp:42:45:错误:类模板参数推断失败:42 |模板cls1({vec,vec+2,vec+3,vec+4});//编译错误您需要在模板cls1中传递模板参数网。list
的元素类型为TIterator
,而不是T
TIterator
可能与T*
@jianzTemplate
相同,也可能不同,但这里没有模板参数推断。您可以只要有一个模板参数:TIterator
并将你的向量建立在它的基础上:std::vector vec;
那么你就不必自己为模板提供类型了。此外,它还变成了编译时检查。这太棒了。在你发表文章之前,我一直在使用“模板”方法。我正在寻找的是你在这里提供的另外两种选择。非常感谢。你能纠正打字错误吗?我已经接受了这个解决方案。1)自定义推断指导方法:“->模板”;2)删除T方法:“使用T=typename std::iterator\u traits::value\u type;”@jianz:typos fixed。(如果仍有一些,请随意编辑)。
template <class TIterator>
struct Template
{
using T = typename std::iterator_traits<TIterator>::value_type;
std::vector<T> vec;
Template(std::initializer_list<TIterator> list)
{
std::cout << "size: " << list.size() << std::endl;
vec.clear();
vec.reserve(list.size());
for(T val : list)
vec.push_back(val);
}
};