C++ 未定义对<;标准::字符串>;std::string&;

C++ 未定义对<;标准::字符串>;std::string&;,c++,C++,可能重复: 我在第行遇到错误:Console::getInstance()->readObjectData(a)在main.cpp中 对void控制台::readObjectDatastd::string&)的未定义引用 控制台.h 有什么想法吗?您没有实施此方法。您必须在.h文件中提供模板的实现您没有实现此方法。您必须在.h文件中提供模板的实现,因为您没有将readObjectData的实现放在头中,所以您需要提供函数的显式专门化,该函数采用std::string& 这应该放在Conso

可能重复:

我在第行遇到错误:Console::getInstance()->readObjectData(a)在main.cpp中

void控制台::readObjectDatastd::string&)的未定义引用

控制台.h


有什么想法吗?

您没有实施此方法。您必须在.h文件中提供模板的实现

您没有实现此方法。您必须在.h文件中提供模板的实现,因为您没有将readObjectData的实现放在头中,所以您需要提供函数的显式专门化,该函数采用std::string&

这应该放在Console.cpp中:

template <>
void Console::readObjectData(string& o) {
    //cin >> o;
}
模板
void控制台::readObjectData(字符串和o){
//cin>>o;
}

因为您没有将readObjectData的实现放在头中,所以需要提供函数的显式专门化—一个接受std::string&

这应该放在Console.cpp中:

template <>
void Console::readObjectData(string& o) {
    //cin >> o;
}
模板
void控制台::readObjectData(字符串和o){
//cin>>o;
}

您不能将模板方法实现放在
控制台中。cpp
它必须出现在头文件中,或者您必须为
std::string

实现显式专门化。您不能将模板方法实现放在
控制台中。cpp
它必须出现在头文件中,或者您必须为
std::string

实现显式专门化。您不能在.cpp文件中定义模板函数

移动

模板
无效控制台::readObjectData(T&o){
//cin>>o;
}
无法在.cpp文件中定义模板函数

移动

模板
无效控制台::readObjectData(T&o){
//cin>>o;
}

到头文件。

模板化函数(readObjectData)的定义必须内联,而不是在.cpp文件中。
当编译器看到一个具有模板化函数的类或一个模板化类时,它会生成一个包含新类型的整个类的副本。因此,如果将函数的定义粘贴在.cpp文件中,编译器将不知道实现在哪里,因为它不存在。

模板函数(readObjectData)的定义必须内联,而不是在.cpp文件中。
当编译器看到一个具有模板化函数的类或一个模板化类时,它会生成一个包含新类型的整个类的副本。因此,如果在.CPP文件中粘贴函数的定义,编译器将不知道实现的位置是什么,因为它不存在。

< P>在将某些C++文件转换为输出(执行、共享库或…)的过程中,2个工具将协同工作,首先是创建对象文件的编译器,然后是将这些对象转换为输出的链接器。您应该知道的是,链接器与模板无关(除非在显式实例化的特殊情况下),模板将由编译器实例化,另一个注意事项是编译器使用源文件中包含的每个源文件和头,并忽略项目的所有其他文件。因此,当编译器想要编译
main.cpp
时,它看不到
readObjectData
的实现,因此它无法在该函数的对象文件中生成任何代码,并且当链接器想要链接对象以获得结果时,它将永远找不到该函数的实现!因此,最简单的方法是将代码的实现> RealObjuttDATABOS//CUT>移到H./C>文件,并且每件事情都会按预期的方式工作。

< P>在将某些C++文件转换为输出(执行、共享库或…)的过程中,2个工具将协同工作,首先是创建对象文件的编译器,然后是将这些对象转换为输出的链接器。您应该知道的是,链接器与模板无关(除非在显式实例化的特殊情况下),模板将由编译器实例化,另一个注意事项是编译器使用源文件中包含的每个源文件和头,并忽略项目的所有其他文件。因此,当编译器想要编译
main.cpp
时,它看不到
readObjectData
的实现,因此它无法在该函数的对象文件中生成任何代码,并且当链接器想要链接对象以获得结果时,它将永远找不到该函数的实现!因此,最简单的方法是将
readObjectData
的实现移动到
.h
文件中,一切都会按预期进行。

编译器需要查看模板函数的定义,您需要在头文件中包含该定义。每天,有一个关于模板和未定义引用的新问题…编译器需要查看模板函数的定义,您需要在头文件中包含该定义。每天都有一个关于模板和未定义引用的新问题。。。
#include "Console.h"

using namespace std;

int main()
{

    string a;

    Console::getInstance()->readObjectData(a);
    return 0;
}
template <>
void Console::readObjectData(string& o) {
    //cin >> o;
}
template <typename T>
void Console::readObjectData(T& o) {
     //cin >> o;
}