gpt4 book ai didi

c++ - 对 `std::ostream& SpyOutput::operator<<(double const&)' 的 undefined reference

转载 作者:行者123 更新时间:2023-11-30 02:54:40 26 4
gpt4 key购买 nike

我正在尝试从标准输出中拦截“数据”(对于这个问题,我正在使用 cout)。同样对于这个问题,我正在使用 double,但该程序应该能够处理任何原始数据类型。当我尝试编译我的代码时出现此错误:

undefined reference to `std::ostream& SpyOutput::operator<< (double const&)' collect2: error: ld returned 1 exit status

这是我的主要内容:

    #include "SpyOutput.h"
#define endl '\n'
int main ( int argc, char *argv[], char *env[] ) {
double d1 = 12.3;
SpyOutput spy(&cout);
spy << d1;
return 0;
}

这是我的头文件:

#include <iostream>
using namespace std;

class SpyOutput {
private:
ostream* output;

public:
SpyOutput(ostream* os);
template <class T>
ostream &operator<<(const T &x);
};

这是我的实现文件:

#include "SpyOutput.h"
SpyOutput::SpyOutput(ostream* os){
output = os;
}

template <class T>
ostream& SpyOutput::operator<<(const T &x){
// SOME CODE GO HERE
return *output;
}

我已经用谷歌搜索了这个错误(和类似错误),但没有找到有效的解决方案,在此先感谢您提供给我的任何帮助或提示! :-)

最佳答案

有什么问题?

有关它为何无法编译的解释,请参阅 "Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file?"

例如,考虑包含以下模板函数声明的头文件 foo.h:

// File "foo.h"
template<typename T>
void foo();

现在假设文件 foo.cpp 实际上定义了该模板函数:

// File "foo.cpp"
#include <iostream>
#include "foo.h"

template<typename T>
void foo()
{
std::cout << "Here I am!\n";
}

假设文件 main.cpp 通过调用 foo() 使用此模板函数:

// File "main.cpp"
#include "foo.h"

int main() { foo<int>(); ... }

如果您编译并链接这两个 .cpp 文件,大多数编译器会生成链接器错误。因为为了让编译器生成代码,它必须看到两者模板定义(不仅仅是声明)和特定类型/用于“填充”模板的任何内容。如果模板主体是在 .cpp 中定义的,编译器将看不到它,因此不会为其生成任何代码。

如何解决?

围绕这个问题有不止一种可能的解决方案。我建议将模板函数的定义移动到 .h 文件中。

// File "foo.h"
template<typename T>
void foo()
{
std::cout << "Here I am!\n";
}

在您的源代码中,您可以像往常一样调用它:

// File "main.cpp"
#include "foo.h"

int main() { foo<int>(); ... }

关于c++ - 对 `std::ostream& SpyOutput::operator<<<double>(double const&)' 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16890633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com