gpt4 book ai didi

c++ - 具有重载 << 运算符的简单模板类失败, "Invalid use of template-id"

转载 作者:行者123 更新时间:2023-11-28 04:26:10 27 4
gpt4 key购买 nike

我正在尝试为我的模板类重载流输出运算符。我一直遇到 undefined reference 的各种麻烦,现在是错误

"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 文件中的声明处):

error: invalid use of template-id 'operator<< <>' in declaration of primary template friend std::ostream &operator<< <>(std::ostream &os, messageTemplate &aTemplate);

最佳答案

我发现有两个问题:

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

关于c++ - 具有重载 << 运算符的简单模板类失败, "Invalid use of template-id",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54262723/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com