main.cpp ||неопределенная ссылка на `MyClass :: loadDatas (std :: basic_string) '| - PullRequest
0 голосов
/ 02 апреля 2011

Я столкнулся с проблемой использования std::string в параметрах:

MyClass имеет такой метод

public:  
    void loadDatas(string filename);

В моем main.cpp есть следующий простой код:

#include <iostream>
#include <string>

#include "myclass.hpp";

using namespace std;

int main()
{

    string foo = "test.txt";
    cout << foo << endl; // Print Hello Kitty, no problems

    MyClass i;
    // The following line raise :
    // obj/Release/src/main.o||In function `main':|
    // main.cpp|| undefined reference to `MyClass::loadDatas(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
    // ||=== Build finished: 1 errors, 0 warnings ===|
    i.loadDatas(foo);

    return EXIT_SUCCESS;

}

Похоже, что libstdc++ хорошо связан (потому что я могу напечатать текст, используя cout), но передача параметров string вызывает ошибку, и я не понимаю, почему. *

Может ли кто-нибудь помочь мне, пожалуйста?

РЕДАКТИРОВАТЬ: я сделал ошибку, на самом деле это i.loadDatas(foo); (я исправил это). Мой исходный код не на английском, поэтому я постарался сделать для вас простую версию на английском. Я действительно вызываю метод экземпляра, а не статический метод.

РЕДАКТИРОВАТЬ 2: Полный исходный код

personnage.hpp

#ifndef PERSONNAGE_H
#define PERSONNAGE_H

#include <iostream>
#include <string>

#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>

#include "carte.hpp"

using namespace std;

class Personnage : public Carte
{

    public:

        Personnage();

        void chargerPersonnage(string nom);

        virtual ~Personnage();

    private:

        //! Le texte d'accroche de la carte
        string _accroche;

};

#endif // PERSONNAGE_H

personnage.cpp

#include "personnage.hpp"

Personnage::Personnage() : Carte("Sans titre")
{

}

void chargerPersonnage(string nom)
{

}

Personnage::~Personnage()
{
    //dtor
}

main.cpp

#include <iostream>
#include <string>

#include <SFML/Graphics.hpp>

#include "personnage.hpp"

using namespace sf;
using namespace std;

int main()
{

    string test = "Hello Kitty";
    cout << test << endl;

    Personnage test2;
    test2.chargerPersonnage(test);

    return EXIT_SUCCESS;
}

журнал ошибок

obj/Release/src/main.o||In function `main':|
main.cpp|| undefined reference to `Personnage::chargerPersonnage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'|
||=== Build finished: 1 errors, 0 warnings ===|

Ответы [ 4 ]

3 голосов
/ 02 апреля 2011

Проблема в том, что вы определили class Personnage как имеющую функцию-члена chargerPersonnage, но в personnage.cpp вы определяете свободную функцию chargerPersonnage.

Вы, похоже, знаете правильный синтаксис, как вы правильно сделали конструктор и деструктор Personnage, но просто чтобы прояснить: измените void chargerPersonnage(string nom) { } на void Personnage::chargerPersonnage(string nom) { } в personnage.cpp.

2 голосов
/ 02 апреля 2011

Просто предположение: если вы не используете use namespace std; в своем заголовочном файле (чего не следует делать, потому что это может быть злом), вам нужно определить свой метод с помощью std::string filename.

2 голосов
/ 02 апреля 2011
MyClass i;
MyClass.loadDatas(foo); 
     //^this syntax is wrong. Dot is used with "instance" of class!

Неправильный синтаксис. Я думаю, что вы хотели написать:

i.loadDatas(foo);

Однако, если loadData является static функцией-членом, то вы должны написать:

MyClass::loadDatas(foo);
     //^^ note the difference!

ОТВЕТЬТЕ НА СВОЙ РЕДАКТИРОВАТЬ:

Я не думаю, что можно указать на ошибку в вашем коде, не увидев больше кода. Возможно, вы не определили функцию loadDatas. Убедитесь, что вы определили это. Также проверьте орфографию, синтаксис и все.

1 голос
/ 02 апреля 2011

Я вижу две проблемы в вашем коде:

  • loadDatas отсутствует тип возврата
  • Я думаю, что вы имеете в виду i.loadDatas(foo);, а не MyClass.loadDatas(foo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...