具有重载<<操作符的简单模板类将失败,“无效使用template-id”

时间:2019-01-18 23:32:14

标签: c++ templates operator-overloading

我正在尝试为我的模板类重载流输出运算符。我一直在使用未定义的引用遇到各种麻烦,现在出现错误

"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);

2 个答案:

答案 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);