Проблемы VisualStudio / C ++ с режимом соответствия с использованием шаблонов / наследования - PullRequest
1 голос
/ 06 августа 2020

Я создал следующее в качестве игрушечного примера, который воспроизводит проблему, с которой я столкнулся с моей большой базой кода. Я пытаюсь использовать виртуальный перегруженный оператор приведения типов в шаблоне класса. Хотя код отлично работает в 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;
}
...