Не удается устранить неразрешенную внешнюю ошибку Ошибка LNK2019

Я пытаюсь создать объект класса A. Компиляция работает нормально, но компоновщик жалуется на неразрешенный внешний символ LNK2019 D::D, на который ссылается функция A::A.

A.cpp

#include "../A.hpp"

using namespace <name>;

A::A(D* low, D* mid, D* high, M* m)
{
    std::vector<B*>* lTC = split(low);
    std::vector<B*>* mTC = split(mid);
    std::vector<B*>* hTC = split(high);

    D* lDC = new D(lTC);
    D* mDC = new D(mTC);
    D* hDC = new D(hTC);

    mr = m;

    procRDC = new std::vector<D*>();
    procRDC->push_back(lDC); 
    procRDC->push_back(mDC);
    procRDC->push_back(hDC);
}

std::vector<B*>* A::split(D* d)
{
    std::vector<B*>* tc = new std::vector<B*>();
    std::vector<B*>* ob = d->getB();

    for ( std::vector<B*>::iterator it = ob->begin(); it != ob->end(); ++it )
    {
        B* b= *it;

        int a1 = b->getA;
        int a2 = b->getA;
        int a3 = b->getA;

        B* b1 = new B(a1, a2, a3);
        B* b2 = new B(a3, a2, a1);

        tc ->push_back(b1);
        tc ->push_back(b2);
    }

    return tc;
}

А.хпп

#ifndef A_HPP
#define A_HPP

#include "../dec.hpp"
#include "../D.hpp"
#include "../M.hpp"
#include "../B.hpp" 
#include <vector>

using namespace <name>;

class A: public dec
{
protected:
    M* mr;
    std::vector<D*>* procRDC;

public:
    A(D* low, D* mid, D* high, M* marketRound);

protected:
    std::vector<B*>* split(D* d);

}; // class A

#endif

Базовый класс dec.cpp содержит пустой конструктор. Я также даю вам D.cpp.

#include "../D.hpp"

using namespace <name>;

D::D(std::vector<B*>* b) 
{
    bs = b;
}

std::vector<B*>* D::getB()
{
    return bs;
}

и Д.хпп

#ifndef D_HPP
#define D_HPP

#include "../B.hpp"
#include <vector> 

using namespace <name>;

class D: public C
{
protected:
    std::vector<B*>* bs;

public:
    D(std::vector<B*>* b);
    std::vector<B*>* getB();

}; // class D

#endif

Класс C содержит только пустой конструктор

B.cpp

#inlcude "../B.hpp"

using namespace <name>

B::B(int a1, int a2, int a3)
{
    a1 = a1;
    a2 = a2;
    a3 = a3;
}

int B::getA() { return a1;  }

Б.хпп

#ifndef B_HPP
#define B_HPP

#include "../O"

using namespace <name>

class B : public O
{
protected:
    int a1;
    int a2;
    int a3;

public:
    B(int a1, int a2, int a3);

public:
    int B::getA();

};

#endif

Теперь он выдает ошибку, что не может найти ссылку на D::D в функции A::A, и некоторые ошибки, что не может найти B::B как в A::A, так и в D::D. Я уже пытался добавить основную функцию, исключив определение базового класса, дважды проверил включение заголовочного файла... При выборе «перейти к объявлению» или «перейти к определению» в Visual Studio 10 он может найти точный D: :D Функция. Я открыл файлы заголовков, чтобы убедиться, что они направляют к правильному файлу, и это так.

Есть ли у вас какие-либо предложения, куда смотреть дальше, чтобы устранить ошибку? Вы где-то замечаете ошибку? Я слишком долго искал, чтобы понять это самостоятельно. Помощь очень ценится! Кстати, мне пришлось изменить фактическое наименование классов, но я проверил, правильно ли назначены псевдо-имена. Если для уточнения ошибки необходимы другие файлы, пожалуйста, дайте мне знать, и я с радостью размещу их здесь.


person Marijn    schedule 09.03.2012    source источник
comment
О, дерьмо, заголовочный файл для C должен быть добавлен в D.hpp. Это имеет место в реальном коде, но здесь я его случайно исключил, поэтому добавление файла C.hpp не является решением проблемы.   -  person Marijn    schedule 09.03.2012


Ответы (1)


D.cpp точно включен в вашу сборку? Если бы D.cpp не было, вы бы получили эту ошибку.

Чтобы убедиться в этом, попробуйте добавить определения для D в D.hpp:

class D: public C
{
protected:
    std::vector<B*>* bs;

public:
    D(std::vector<B*>* b) : bs(b) {}
    std::vector<B*>* getB() { return bs; }

}; // class D

Если это устраняет ошибку компоновщика, вы не включаете D.cpp в свою сборку.

person Fraser    schedule 09.03.2012
comment
Я попробовал ваше предложение, но это не решило ошибку. CPP также виден в исходных файлах. - person Marijn; 10.03.2012
comment
Ваш пример работает для меня (с парой незначительных изменений); Я могу создавать экземпляры объектов A, B и D. Вы, должно быть, что-то меняете, упрощая реальный код до образца. Когда вы редактировали свой вопрос, вы упомянули дополнительные ошибки; это тоже LNK2019 ошибки? - person Fraser; 11.03.2012
comment
Все они являются ошибками LNK2019, относящимися к классу B или D. Единственное, что я здесь не уточнил, это базовый класс O, который не пуст, но содержит более или менее те же методы, что и B. Так что, возможно, это скорее проблема наследования... Позвольте мне попробовать очистить базовый класс, чтобы посмотреть, сработает ли он для меня завтра. Если это произойдет, я опубликую более конкретный вопрос, чем тот, что указан выше. Если нет, то я знаю, что приведенный выше код не содержит серьезных ошибок. Спасибо за помощь! - person Marijn; 11.03.2012