C++,模板和运算符 << (使用Qt框架)
我正在构建一个名为 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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
实例化需要完整的模板代码,因此,如果将代码放入
.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.链接器是正确的:没有
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.
您需要在类声明中而不是在类定义中实现模板。 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 :(.