我在参数中使用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 ===|
答案 0 :(得分:3)
问题在于您已将class Personnage
定义为具有成员函数 chargerPersonnage
,但在personnage.cpp中您定义了自由函数 chargerPersonnage
代替。
您似乎知道正确的语法,正如您Personnage
的构造函数和析构函数正确一样,但只是为了说清楚:在personnage.cpp中将void chargerPersonnage(string nom) { }
更改为void Personnage::chargerPersonnage(string nom) { }
。
答案 1 :(得分:2)
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
。确保你已经定义了它。另外,请查看拼写,语法和所有内容。
答案 2 :(得分:2)
猜猜:如果你在头文件中没有使用use namespace std;
(你不应该因为它可能是邪恶的),你需要用std::string filename
来定义你的方法。
答案 3 :(得分:1)
我在你的代码中看到两个问题:
loadDatas
缺少返回类型i.loadDatas(foo);
而不是MyClass.loadDatas(foo);