Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Call of overloaded class is ambiguous


Автор: kefir01 12.5.2011, 16:59
День добрый!
Есть такой класс...

Код

#ifndef QGSRECT_H
#define QGSRECT_H

#include <QObject>
#include <QPointF>

class QGSRect
{
public:
    QGSRect()
    {
        QGSRect(0.0, 0.0, 0.0, 0.0);
    }

    ~QGSRect()
    {
        xmin = NULL;
        xmax = NULL;
        ymin = NULL;
        ymax = NULL;
    }

    QGSRect(QString xMin = "0", QString yMin = "0", QString xMax = "0", QString yMax = "0")
    {
        this->xmin = xMin.toDouble();
        this->xmax = xMax.toDouble();
        this->ymin = yMin.toDouble();
        this->ymax = yMax.toDouble();
    }

    QGSRect(double xMin = 0.0, double yMin = 0.0, double xMax = 0.0, double yMax = 0.0)
    {
        this->xmin = xMin;
        this->xmax = xMax;
        this->ymin = yMin;
        this->ymax = yMax;
    }

    QGSRect(int xMin = 0, int yMin = 0, int xMax = 0, int yMax = 0)
    {
        this->xmin = (double)xMin;
        this->xmax = (double)xMax;
        this->ymin = (double)yMin;
        this->ymax = (double)yMax;
    }


    double xMin();
    double xMax();
    double yMin();
    double yMax();

    QPointF center();
    void clearPlus();


signals:

public slots:

private:

    double xmin;
    double ymin;
    double xmax;
    double ymax;

};

#endif // QGSRECT_H
#ifndef QGSRECT_H
#define QGSRECT_H

#include <QObject>
#include <QPointF>

class QGSRect
{
public:
    QGSRect()
    {
        QGSRect(0.0, 0.0, 0.0, 0.0);
    }

    ~QGSRect()
    {
        xmin = NULL;
        xmax = NULL;
        ymin = NULL;
        ymax = NULL;
    }

    QGSRect(QString xMin = "0", QString yMin = "0", QString xMax = "0", QString yMax = "0")
    {
        this->xmin = xMin.toDouble();
        this->xmax = xMax.toDouble();
        this->ymin = yMin.toDouble();
        this->ymax = yMax.toDouble();
    }

    QGSRect(double xMin = 0.0, double yMin = 0.0, double xMax = 0.0, double yMax = 0.0)
    {
        this->xmin = xMin;
        this->xmax = xMax;
        this->ymin = yMin;
        this->ymax = yMax;
    }

    QGSRect(int xMin = 0, int yMin = 0, int xMax = 0, int yMax = 0)
    {
        this->xmin = (double)xMin;
        this->xmax = (double)xMax;
        this->ymin = (double)yMin;
        this->ymax = (double)yMax;
    }


    double xMin();
    double xMax();
    double yMin();
    double yMax();

    QPointF center();
    void clearPlus();


signals:

public slots:

private:

    double xmin;
    double ymin;
    double xmax;
    double ymax;

};

#endif // QGSRECT_H


При использовании типа:
Код

    QGSMapInfo(QString name, QGSRect boundingBox)
    {
        mapName = name;
        mapBoundingBox = boundingBox; //QGSRect mapBoundingBox
    }


выдает следующую ругань:
Код

qgsmapinfo.h:15: error: call of overloaded 'QGSRect()' is ambiguous


Не подскажете в чем дело?

Автор: borisbn 12.5.2011, 17:27
Цитата(kefir01 @  12.5.2011,  16:59 Найти цитируемый пост)

QGSRect()
    {
        QGSRect(0.0, 0.0, 0.0, 0.0);
    }

1. Так нельзя. Нельзя вызывать один конструктор из другого. Это можно только в новом стандарте, и то там синтаксис вызова другой.
2. 
Цитата
QGSRect()

и
Цитата
QGSRect(QString xMin = "0", QString yMin = "0", QString xMax = "0", QString yMax = "0")

при таком вызове
Код
QGSRect x;

не будут отличаться. Что вызывать компилятору ? 1-ю форму или 2-ю ? Он не знает, вот и сообщает об этом

Цитата(kefir01 @  12.5.2011,  16:59 Найти цитируемый пост)
call of overloaded 'QGSRect()' is ambiguous

т.е. не понятно какой конструктор вызывать

Автор: Sartorius 12.5.2011, 17:29
Конструкторы не смущают?  smile  Хотя бы один параметр должен быть обязательным чтобы компилятор мог их различить.

Автор: math64 13.5.2011, 11:04
А зачем нужен конструктор по умолчанию? Конструктор, у которого всем параметрам заданы значения по умолчанию может работать за него.

Автор: kefir01 13.5.2011, 14:50
Ну насчет конструктора по умолчанию - да лажанулся. А про остальные понял не до конца - т.е. у одного из них должен быть один параметр без умолчания?

Автор: borisbn 13.5.2011, 15:08
Цитата(kefir01 @  13.5.2011,  14:50 Найти цитируемый пост)
А про остальные понял не до конца - т.е. у одного из них должен быть один параметр без умолчания?

не обязательно. просто при наличии таких двух конструкторов
Код

QGSRect()
// и
QGSRect(QString xMin = "0", QString yMin = "0", QString xMax = "0", QString yMax = "0")

компилятор не может выбрать какой из них использовать.
Оставь только второй (пусть все параметры имеют умолчания) и ты не оставишь компилятору выбора. соответственно он перестанет ругаться.

Кста, то же самое применимо не только к конструкторам, но и к обычным ф-циям:
Код

void foo( int x, int y = 0 );
void foo( int x );
...

foo( 42 ); // ошибка. какой вариант вызывать ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)