类模板内的友元函数

问题描述 投票:0回答:1
#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>
。我的问题是,为什么这有效?

我是模板编程的新手,因此很难理解为什么它有效以及为什么我的原始代码不起作用。

c++ templates operator-overloading friend ostream
1个回答
0
投票

本声明

friend std::ostream& operator<< (std::ostream &stream, const testClass<type, size>& test);

声明一个非模板友元函数。您需要在类

test
的定义中定义它,或者为类
test
的每个特化定义友元函数。

© www.soinside.com 2019 - 2024. All rights reserved.