gpt4 book ai didi

c++ - 理解 C++ 中的模板

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:43 24 4
gpt4 key购买 nike

我正在尝试运行以下程序,但它会产生编译错误:

#ifndef TEMPLATE_SUM_H_
#define TEMPLATE_SUM_H_

template<typename T>
class sum
{
public:
sum() {
val_1 = 0;
val_2 = 0;
}
sum(T a, T b) {
val_1 = a;
val_2 = b;
}
friend std::ostream& operator<<(std::ostream &, const sum<> &);

private:
T val_1, val_2;
T result() const;
};

#endif

源文件:

include <iostream>
#include "inc/sum.h"

template<typename T>
T sum<T>::result() const {
return (val_1 + val_2);
}

template<typename T>
std::ostream& operator<<(std::ostream& os, const sum<T>& obj) {
//std::ostream& operator<<(std::ostream& os, sum<T>& obj) {
os << obj.result();
return os;
}

int main()
{
sum<int> int_obj(15, 15);
sum<float> float_obj(5.2, 3.5);
std::cout << "result of int = " << int_obj << std::endl;
std::cout << "result of float = " << float_obj << std::endl;
return 0;
}

使用 g++ (4.4.3) 编译会产生以下错误:

In file included from template.cpp:2:
inc/sum.h:18: error: wrong number of template arguments (0, should be 1)
inc/sum.h:5: error: provided for ‘template<class T> class sum’
template.cpp: In function ‘std::ostream& operator<<(std::ostream&, const sum<T>&) [with T = int]’:
template.cpp:20: instantiated from here
template.cpp:5: error: ‘T sum<T>::result() const [with T = int]’ is private
template.cpp:12: error: within this context
template.cpp: In function ‘std::ostream& operator<<(std::ostream&, const sum<T>&) [with T = float]’:
template.cpp:21: instantiated from here
template.cpp:5: error: ‘T sum<T>::result() const [with T = float]’ is private
template.cpp:12: error: within this context

1) 谁能帮我找出错误?另外请推荐一些链接,我可以在其中找到有关如何在 C++ 中使用模板的绝对详细信息。

2) 我读到在头文件中声明并单独定义的模板化函数/类容易出现链接错误。谁能解释/详细说明这个?在上面的例子中是否有链接错误的可能性?

声明如下:

“如果在 .h 文件中声明了模板或内联函数,请在同一文件中定义它。这些结构的定义必须包含在每个使用它们的 .cpp 文件中,否则程序可能会失败链接到一些构建配置中。”

这个例子可以用一些更简单的方法来完成,而无需使用重载运算符等。但我正在尝试学习/练习模板并试验一些功能。

最佳答案

friend 函数声明需要单独的模板定义:

template<typename U>
friend std::ostream& operator<<(std::ostream &, const sum<U> &);

friend 声明不会继承封闭类的模板参数。

关于c++ - 理解 C++ 中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31204068/

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