我正在尝试为我的模板类重载流输出运算符。我一直在使用未定义的引用遇到各种麻烦,现在出现错误
"invalid use of template-id 'operator<< <>' in declaration of primary template"
我已经阅读了我在正确的声明中可以找到的所有Stackoverflow和其他论坛帖子,人们似乎可以通过多种方式来管理我想要的结果。谁能帮助我了解问题出在哪里?
.h文件:
//class must be forward declared because it contains a friend function template
template<class T> class messageTemplate;
//friend function also must be forwards declared
template<class A> std::ostream &operator<<(std::ostream &os, messageTemplate<A> &aTemplate);
template <class T>
class messageTemplate {
public:
messageTemplate(const std::string &topic, T data);
template <class A>
friend std::ostream &operator<< <>(std::ostream &os, messageTemplate<A> &aTemplate);
private:
std::string topic;
T data;
};
.cpp:
template class messageTemplate<int>;
template class messageTemplate<double>;
template class messageTemplate<std::string>;
template class messageTemplate<bool>;
template<class T>
messageTemplate<T>::messageTemplate(const std::string &topic, T data):topic(topic), data(data) {};
template <class T>
std::ostream &operator<< (std::ostream &os, messageTemplate<T> &aTemplate) {
os << "topic: " << aTemplate.topic << " data: " << aTemplate.data;
return os;
};
到目前为止,我已经尝试并应用了许多解决方案,我觉得从头开始可能会更好。
完整的错误消息(出现在het .h文件中的声明处):
错误:声明以下内容时无效地使用了模板ID'operator << <> 主要模板 朋友std :: ostream&operator << <(std :: ostream&os,messageTemplate&aTemplate);
答案 0 :(得分:1)
我看到两个问题:
1)operator <<的重载函数声明包含字符<>
,这会导致编译失败。可以通过删除<>
2)operator <<(和类ctor)的重载函数定义存在于源文件中,这导致链接器失败。可以通过将这些定义从源文件移动到头文件来解决此问题。
尝试使用以下头文件和源文件,这对我有用...
template.h
#pragma once
#include <iostream>
#include <string>
//class must be forward declared because it contains a friend function template
template<class T> class messageTemplate;
//friend function also must be forwards declared
template<class A> std::ostream &operator<<(std::ostream &os, messageTemplate<A> &aTemplate);
template <class T>
class messageTemplate {
public:
messageTemplate(const std::string &topic, T data);
template <class A>
friend std::ostream &operator<<(std::ostream &os, messageTemplate<A> &aTemplate);
private:
std::string topic;
T data;
};
template<class T>
messageTemplate<T>::messageTemplate(const std::string &topic, T data):topic(topic), data(data) {};
template <class T>
std::ostream &operator<< (std::ostream &os, messageTemplate<T> &aTemplate) {
os << "topic: " << aTemplate.topic << " data: " << aTemplate.data;
return os;
};
main.cpp
#include "template.h"
#include <iostream>
using namespace std;
int main()
{
messageTemplate< int > test{ "test", 69 };
cout << test << endl;
return 0;
}
控制台输出:
topic: test data: 69
Process finished with exit code 0
答案 1 :(得分:0)
表面上,问题是您试图重载的不是运算符“ <<”,而是运算符“ << <>>
从.h文件中替换
friend std::ostream &operator<< <>(std::ostream &os, messageTemplate<A> &aTemplate);
与
friend std::ostream &operator<< (std::ostream &os, messageTemplate<A> &aTemplate);