在使用其父模板方法之一编写子类时,我经常遇到编译问题。例如,我写了这个,但我不知道它为什么编译:
#include <iostream>
#include <type_traits>
#include <algorithm>
/******************** ********** ********************/
template <class T, unsigned N>
struct A
{
T data[N];
template <class U>
inline auto operator= ( const U& other ) -> decltype(*this)
{ this->assign(other); return *this; }
template <class U>
void assign( const U& other )
{ assign_impl( other, std::is_arithmetic<U>() ); }
template <class U>
void assign_impl( const U& val, std::true_type const )
{ std::fill( data, data+N, static_cast<T>(val) ); }
};
// ------------------------------------------------------------------------
template <class T, unsigned N>
struct B
: public A<T,N>
{
// Needed in order to compile
using A<T,N>::operator=;
void show()
{
for (unsigned i=0; i<N; ++i)
std::cout<< this->data[i] << " ";
std::cout<< std::endl;
}
};
// ------------------------------------------------------------------------
int main()
{
B<double,5> b;
b = -5.1;
b.show();
b.assign(3.14159);
b.show();
}
如果我想将此运算符与using A<T,N>::operator=;
的实例一起使用,则必须包含语句B<T,N>
,但我从未指定方法assign
应该是可见的。它是否可见,因为operator=
使用它?
答案 0 :(得分:2)
方法assign
在您的班级B
中可见,因为您正在使用具有公共默认封装和struct
继承的public
。
至于operator=
:
(13.5.3赋值)赋值运算符应由a实现 只有一个参数的非静态成员函数。因为副本 赋值运算符operator =是为类隐式声明的 用户未声明,基类赋值运算符始终是 由派生类的复制赋值运算符隐藏。