C++,模板和运算符 << (使用Qt框架)

发布于 2024-10-12 17:15:30 字数 969 浏览 6 评论 0 原文

我正在构建一个名为 Output 的小类...它的目的是在编写输出方面简化我的编程(例如支持更多类型的输出到标准输出(如 QString)等等...)

到目前为止很好,它可以与 QString 一起使用,但现在我想让它接受任何类型作为参数。但在编译时,我收到此错误:

main.cpp:16: 错误:未定义对“Output&”的引用输出::运算符<< (整数)'

这是我的输出类 .h 和 .cpp 文件:

.h

#ifndef OUTPUT_H
#define OUTPUT_H

#include <QObject>
#include <QTextStream>

class Output : public QObject
{
    Q_OBJECT

public:
    Output();
    template <class _T> Output& operator<<(const _T& Text);  
signals:

public slots:
};

extern Output out;

#endif // OUTPUT_H

.cpp

#include "output.h"

Output out;

Output::Output()
{
}

template <class _T> Output& Output::operator <<(const _T& Data)
{
    QTextStream s(stdout);

    s.setCodec("UTF-8");
    s<<Data;
    s.flush();
    return *this;
}

I'm building little class called Output ... It's meant to be something that will ease my programming in terms of writing output (like support more types for output to stdout (like QString) and so on ...)

So far it was good, it worked with QString, but now I wanted to make it to accept any type as argument. But while compiling, I get this error:

main.cpp:16: error: undefined reference to `Output& Output::operator<< (int)'

Here's my output class .h and .cpp files:

.h

#ifndef OUTPUT_H
#define OUTPUT_H

#include <QObject>
#include <QTextStream>

class Output : public QObject
{
    Q_OBJECT

public:
    Output();
    template <class _T> Output& operator<<(const _T& Text);  
signals:

public slots:
};

extern Output out;

#endif // OUTPUT_H

.cpp

#include "output.h"

Output out;

Output::Output()
{
}

template <class _T> Output& Output::operator <<(const _T& Data)
{
    QTextStream s(stdout);

    s.setCodec("UTF-8");
    s<<Data;
    s.flush();
    return *this;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

提赋 2024-10-19 17:15:30

实例化需要完整的模板代码,因此,如果将代码放入 .cpp 文件中,您将只能在该文件中使用它。

Full template code is needed for instantiation, therefore if you put the code inside a .cpp file you will only be able to use it inside this file.

北笙凉宸 2024-10-19 17:15:30

链接器是正确的:没有 Output::operator << 的实例化( const int& ) 在您的代码中。
为了让编译器生成模板的代码,它必须在编译时可见:将你的定义放在头文件中,问题就会解决。

the linker is right: there is no instantiation of Output::operator << ( const int& ) in your code.
In order for the compiler to generate code for the template, it must be visible at compile time: put your defuinition in the header file and the problem will be solved.

会发光的星星闪亮亮i 2024-10-19 17:15:30

您需要在类声明中而不是在类定义中实现模板。 C++ 编译器根本不编译您的“Output::operator <<”对于 .cpp 文件中的“T = int”,因为它不“知道”您将在不同的 .cpp 文件中将其与“int”一起使用。移动“输出::运算符<<”从 .cpp 到 .h 的主体将解决您的问题,因为 .h 包含在您的代码使用带有“int”的模板的同一编译单元中。不幸的是,我不记得在 .cpp 文件中实现模板的正确方法:(。

You need to implement your template in class declaration, not in class definition. C++ compiler simply not compiling your "Output::operator <<" for "T = int" in .cpp file since it don't "know" that you will use it with "int" in different .cpp file. Moving "Output::operator <<" body from .cpp to .h will fix your problem since .h is included in same compile unit where your code is using template with "int". Unfortunately, i don't remember a correct way to implement templates in .cpp files :(.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文