Простой шаблонный класс с перегруженным оператором << терпит неудачу, "Недопустимое использование идентификатора шаблона" - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь перегрузить оператор вывода потока для моего шаблонного класса.Я сталкивался со всевозможными проблемами с неопределенными ссылками, и теперь ошибка

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

ошибка: недопустимое использованиеидентификатора шаблона 'operator << <>' в объявлении основного друга шаблона std :: ostream & operator << <> (std :: ostream & os, messageTemplate & aTemplate);

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я вижу две проблемы:

1) объявление перегруженной функции для оператора << содержит символы <code><>, что приводит к ошибке компиляции. Это можно исправить, удалив <>

2) определение перегруженной функции для оператора << (и класса ctor) существует в исходном файле, что вызывает сбой компоновщика. Это можно исправить, переместив эти определения из исходного файла в файл заголовка. </p>

Попробуйте использовать следующие заголовочные и исходные файлы, это работает для меня ...

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
0 голосов
/ 19 января 2019

Якобы проблема в том, что вы пытаетесь перегрузить не оператор "<<", а оператор "<< <>"

Из файла .h заменить

 friend std::ostream &operator<< <>(std::ostream &os, messageTemplate<A> &aTemplate);

с

  friend std::ostream &operator<< (std::ostream &os, messageTemplate<A> &aTemplate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...