【发布时间】:2021-08-05 00:46:10
【问题描述】:
最初是在研究其他人之前提出的问题:Why string is not printed?C++。看到 OP 并没有完全利用 DataOut 和 GetData 的模板,所以我也尝试将它们制作为模板。
这是我最终得到的代码:
#include <iostream>
#include <string>
template<class T>
class Array{
public:
T U[10];
friend void DataOut(const Array&);
friend void GetData(Array&);
};
template<class T>
void DataOut(const Array<T>& arr){
std::cout << arr.U[0];
}
template<class T>
void Getdata(Array<T>& arr){
std::cin >> arr.U[0];
std::cin.clear();
}
int main(){
Array<std::string> Arr1;
Getdata(Arr1);
DataOut(Arr1);
}
但是,DataOut 的引用未定义:main.cpp:(.text+0x3a): undefined reference to 'DataOut(Array<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)'
我找到了两种解决方法:
- 在
Array类中定义DataOut。 - 在 main 中调用
DataOut<std::String>,而不仅仅是DataOut。
问题是,GetData 怎么没有出错?我还尝试以不同的顺序调用和定义它们,但结果仍然相同。
我有什么遗漏吗?还是我的编译器 (clang 7.0.0) 的错?
【问题讨论】:
标签: c++ templates friend friend-function