#include <iostream>
template <typename type, int size>
class testClass
{
type num[size];
public:
testClass(std::initializer_list<type> list)
{
int i = 0;
for (auto elem : list) {
num[i] = elem;
i++;
}
}
friend std::ostream& operator<< (std::ostream &stream, const testClass<type, size>& test);
};
template<typename type, int size>
std::ostream& operator<< (std::ostream &stream, const testClass<type, size>& test)
{
for (int i = 0; i < size; i++) {
stream << test.num[i];
}
}
int main()
{
testClass<int, 3> test{ 1, 2, 3 };
std::cout << test;
}
即使我似乎在模板类中正确声明了友元函数,我的代码也会导致链接错误。这是一个演示该问题的简化程序。
我知道对此有多种解决方案,其中之一是在好友声明之前写下
template <typename type, int size>
。我的问题是,为什么这有效?
我是模板编程的新手,因此很难理解为什么它有效以及为什么我的原始代码不起作用。
本声明
friend std::ostream& operator<< (std::ostream &stream, const testClass<type, size>& test);
声明一个非模板友元函数。您需要在类
test
的定义中定义它,或者为类 test
的每个特化定义友元函数。