Конструктор с пользовательскими классами в качестве аргументов выдает «Нет подходящей функции для вызова ...» - PullRequest
0 голосов
/ 11 ноября 2009

Я пытаюсь создать конструктор для пользовательского типа, но по какой-то причине он пытается вызвать, я предполагаю, конструктор в определении конструктора другого класса. Не удалось найти ничего подходящего те же симптомы, которые возникают у меня при любых других вопросах, а также, возможно, я не знаю, что ищу.

Когда я звоню:

LatLngBounds clusterBounds(&boundsNorthEast, &boundsSouthWest);

в main.cpp, в LatLngBounds.cpp я получаю "Нет подходящей функции для вызова 'LatLng: LatLng ()", брошенной дважды в строку для:

LatLngBounds::LatLngBounds(LatLng &newSouthWest, LatLng &newNorthEast)

У кого-нибудь есть идеи?

Дрю Дж. Сонн.

IDE: Xcode 3.2 (предназначен для отладки 10.5)
ОС: OSX 10.6
Компилятор: GCC 4.2
Арка: x86_64



main.cpp:

std::vector<std::string> argVector;

... fill up my argVector with strings..

vector<double> boundsVector = explodeStringToDouble(argVector[i]);
LatLng boundsNorthEast(0, boundsVector[0], boundsVector[1]);
LatLng boundsSouthWest(0, boundsVector[2], boundsVector[3]);
LatLngBounds clusterBounds(&boundsNorthEast, &boundsSouthWest);

LatLngBounds.h

#ifndef __LATLNGBOUNDS
#define __LATLNGBOUNDS
#include "LatLng.h"
class LatLngBounds {
private:
    LatLng northEast;
    LatLng southWest;
public:
    LatLngBounds(LatLng&,LatLng&);
};
#endif

LatLngBounds.cpp

#include "LatLngBounds.h"
#include "LatLng.h"

LatLngBounds::LatLngBounds(LatLng &newSouthWest, LatLng &newNorthEast)
{
    this->southWest = newSouthWest;
    this->northEast = newNorthEast;
};

LatLng.h

#ifndef __LATLNGDEF
#define __LATLNGDEF
class LatLng {
public:
    LatLng(int,double,double);
private:
    double lat, lng;
    int id;
};
#endif

LatLng.cpp

#include "LatLng.h"
LatLng::LatLng(int newId, double newLat, double newLng)
{
    /* Grab our arguments */
    id = newId;
    lat = newLat;
    lng = newLng;
};

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

В вашем классе у вас есть два экземпляра объектов LatLng. Чтобы построить ваш объект, компилятору также необходимо создать их.

class LatLngBounds {
private:
    LatLng northEast;
    LatLng southWest;

Так как класс LatLng не имеет конструктора по умолчанию, вам необходимо явно указать компилятору, как построить этот объект:

LatLngBounds::LatLongBounds( ..constructor args.. )
    : northEast( ..args for northEast constructor call ..),
      southWest( ..args for southWest constructor call ..)
{
}
3 голосов
/ 11 ноября 2009

Ваш

LatLngBounds::LatLngBounds(LatLng &newSouthWest, LatLng &newNorthEast)

ожидает аргументы типа LatLng, неявно переданные по ссылке.

В вызове LatLngBounds clusterBounds(&boundsNorthEast, &boundsSouthWest); вместо двух указателей (введите LatLng*).

Попробуйте вместо:

LatLngBounds clusterBounds(boundsNorthEast, boundsSouthWest);
0 голосов
/ 11 ноября 2009

Вы уверены, что указанное вами сообщение об ошибке завершено? Как вы вставили, он указывает, что по умолчанию нет пустого конструктора для LatLng, который компилятор предоставит вам бесплатно.

Однако, похоже, что эта строка в main.cpp неверна:

LatLngBounds clusterBounds(&boundsNorthEast, &boundsSouthWest);

Определением конструктора для LatLngBounds являются 2 неконстантные ссылки на объекты LatLng, но вы передаете 2 указателя на объекты LatLng. Просто передайте их без указателя:

LatLngBounds clusterBounds(boundsNorthEast, boundsSouthWest);
...