我用C ++ 17实现了一个简单的程序,其中我尝试使用参数扩展从派生类中调用基类operator=
。但是该程序无法编译。
#include "pch.h"
#include <iostream>
class D
{
public:
D()
{
std::cout << "D ctror" << std::endl;
}
D & operator = (const D & other)
{
return *this;
}
};
class C
{
public:
C()
{
std::cout << "C ctror" << std::endl;
}
C & operator = (const C & other)
{
return *this;
}
};
class B
{
public:
B()
{
std::cout << "B ctror" << std::endl;
}
B & operator = (const B & other)
{
std::cout << "operator B" << std::endl;
return *this;
}
};
template<typename... Ts> class A: public Ts...
{
public:
A(): Ts()...
{
}
A & operator = (const A & other)
{
Ts::operator =(other);
return *this;
}
};
int main()
{
A<B,C,D> a1;
A<B,C,D> a2;
a1 = a2;
}
使用的工具集是Visual Studio 2017(v141)
生成的错误如下
错误C3520:'=':必须在这种情况下扩展参数包 注意:在编译类模板成员函数'A时 &A :: operator =(const A&)'注意:请参阅参考 函数模板实例化'A&A :: operator =(const 一个&)'正在被编译的注释:请参见对类模板的引用 实例化“ A”正在编译
答案 0 :(得分:2)
您需要扩展参数包。折叠效果如何?
(Ts::operator=(other), ...);
这将展开Ts...
,并有效地创建对operator=
的多个调用,包中的每种类型一个。