Я создал следующее в качестве игрушечного примера, который воспроизводит проблему, с которой я столкнулся с моей большой базой кода. Я пытаюсь использовать виртуальный перегруженный оператор приведения типов в шаблоне класса. Хотя код отлично работает в Visual Studio с отключенным режимом соответствия («разрешающий»), я получаю сообщение об ошибке при использовании режима строгого соответствия. Я хотел бы знать, если что-то не так с этой реализацией, потому что важно, чтобы эта библиотека кода была переносимой. Может ли кто-нибудь помочь мне понять, что с этим что-то не так?
Когда я пытаюсь скомпилировать строку:
Shape<dim, dim> retval = Square<dim>::operator Shape<dim, dim>();
я получаю ошибку C7527 'dim': имя параметра шаблона не может быть повторно объявлено
Я не могу найти никакой документации по ошибке C7527. Я использую VS 2019.
using std::cout;
using std::endl;
template <int length, int width>
class Shape
{
public:
int GetLength() { return length; }
int GetWidth() { return width; }
int Area() { return length * width; }
int Volume() { return length * width * height; }
void SetHeight(int height_in) { height = height_in; }
private:
int height;
};
template <int size>
class Square
{
public:
virtual operator Shape<size, size>() const
{
Shape<size, size> retval;
retval.SetHeight(0u);
return retval;
}
};
template<int dim>
class Cube : public Square<dim>
{
public:
virtual operator Shape<dim, dim>() const override
{
Shape<dim, dim> retval = Square<dim>::operator Shape<dim, dim>();
retval.SetHeight(dim);
return retval;
}
};
int main()
{
Cube<3> myCube;
Shape<3, 3> myShape = Shape<3, 3>(myCube);
cout << myShape.Volume() << endl;
}