如何解决在C ++中创建可变参数类时出错
我正在尝试创建一个类,当该类提供了一系列的成对的迭代器开始和结束时,将生成一系列向量,这些向量给出输入向量中元素的笛卡尔积。
当将2对迭代器分配给该类的初始化程序时,该代码将起作用。但是,添加另一对后,它将无法编译。
iterators.h
template<typename InputIterator,typename ...InputIterators>
class Product{
typedef typename std::iterator_traits<InputIterator>::value_type base_value;
InputIterator base,end,curr;
Product* next = nullptr;
void reset(){
curr = base;
}
public:
explicit Product(InputIterator begin,InputIterator end,InputIterators... args) :base(begin),end(end){
curr = begin;
next = new Product(args...);
}
explicit Product(InputIterator begin,InputIterator end):base(begin),end(end){
curr=begin;
}
bool has_next(){
if (!next){
return curr+1!=end;
}
return next->has_next() || (curr+1)!=end;
}
Product& operator++(){
if (!next){
curr++;
return *this;
}
if(!next->has_next()){
curr++;
next->reset();
return *this;
}
++(*next);
return *this;
}
std::vector<base_value> operator*(){
if(!next){
return std::vector<base_value>({*curr});
}
std::vector<base_value> ans = *(*next);
ans.insert(ans.begin(),*curr);
return ans;
}
};
main.cpp
#include<vector>
#include"itertools.h"
int main(){
std::vector<int> a = {0,1,2,3},b = {4,5,6};
auto q = Product(a.begin(),a.end(),b.begin(),b.end());
auto w = *q;
for(auto i:w){
std::cout<<i<<' ';
}
std::cout<<std::endl;
while(q.has_next()) {
++q;
w = *q;
for (auto i:w) {
std::cout << i << ' ';
}
std::cout << std::endl;
}
}
return 0;
}
错误
In file included from main.cpp:4:
itertools.h:91:20: error: no matching constructor for initialization of 'Product<std::__1::__wrap_iter<int *>,std::__1::__wrap_iter<int *>,std::__1::__wrap_iter<int *> >'
next = new Product(args...);
^ ~~~~
main.cpp:11:14: note: in instantiation of member function 'Product<std::__1::__wrap_iter<int *>,std::__1::__wrap_iter<int *> >::Product' requested here
auto q = Product(a.begin(),b.end(),b.end());
^
itertools.h:93:14: note: candidate constructor not viable: requires 2 arguments,but 4 were provided
explicit Product(InputIterator begin,end(end){
^
itertools.h:89:14: note: candidate constructor not viable: requires 6 arguments,end(end){
^
itertools.h:81:7: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument,but 4 were provided
class Product{
^
itertools.h:81:7: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument,but 4 were provided
1 error generated.
解决方法
这是对1201ProgramAlarm答案的总结(简化为最小的可复制示例)。我找不到推论Product
的模板参数的方法。
#include <iostream>
#include <iterator>
#include <vector>
template <typename InputIterator>
class Product{
InputIterator base,end,curr;
Product* next = nullptr;
public:
template <typename ... InputIterators>
explicit Product (InputIterator begin,InputIterator end,InputIterators ... args) : base (begin),end (end){
std::cout << "templated constructor\n";
curr = begin;
next = new Product (args...);
}
explicit Product (InputIterator begin,InputIterator end) : base (begin),end (end){
std::cout << "untemplated constructor\n";
curr=begin;
}
};
int main(){
std::vector<int> a = {0,1,2,3},b = {4,5,6},c = {7,8,9};
auto q = Product <std::vector<int>::iterator> (a.begin (),a.end (),b.begin (),b.end (),c.begin (),c.end ());
}
输出:
templated constructor
templated constructor
untemplated constructor
,
调用new Product
并为其传递6个迭代器时,您的模板类具有5个模板参数(InputIterator
(前两个参数使用该参数)和{{1}中的其他4种类型}。
在构造函数中,您尝试创建一个新的InputIterators
,但要少两个参数(4)。编译器会找到带有2个或6个参数的构造函数(在带有错误的注释中进行报告)。它无法实例化4参数构造函数,因为Product
是4(可能是不同的)类型,并且需要4参数。
一种可能的解决方法是创建一个模板化的构造函数,该构造函数实际上可以重新定义所有其他参数的作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。