如何告诉编译器我的朋友函数是函数模板

Posted

技术标签:

【中文标题】如何告诉编译器我的朋友函数是函数模板【英文标题】:How to tell the compiler my friend function is function template 【发布时间】:2016-04-24 08:42:04 【问题描述】:

这是我的代码:

#include <iostream>
#include <cstddef>

class alloc 


;

template <class T, class Alloc = alloc, size_t BufSiz = 0>
class deque

public:
    deque()  std::cout << "deque" << std::endl; 
;

template <class T, class Sequence = deque<T> >
class stack

public:
    stack()  std::cout << "stack" << std::endl; 
private:
    Sequence c;
    friend bool operator== <> (const stack<T, Sequence>&, const stack<T, Sequence> &);
    friend bool operator< <> (const stack<T, Sequence>&, const stack<T, Sequence>&);
;

template <class T, class Sequence>
bool operator== (const stack<T, Sequence>&x, const stack<T, Sequence>&y)

    return std::cout << "opertor == " << std::endl;


template <class T, class Sequence>
bool operator < (const stack<T, Sequence> &x, const stack<T, Sequence> &y)

    return std::cout << "operator <" << std::endl;


int main()

    stack<int> x; // deque stack
    stack<int> y; // deque stack

    std::cout << (x == y) << std::endl; // operator == 1
    std::cout << (x < y) << std::endl; // operator < 1

我只是想一个简单的 符号告诉编译器我的函数是函数模板。但我得到两行错误:朋友只能是类或函数

friend bool operator== <> (const stack<T, Sequence>&, const stack<T, Sequence> &);
friend bool operator< <> (const stack<T, Sequence>&, const stack<T, Sequence>&);

我该怎么做才能解决它。

【问题讨论】:

【参考方案1】:

只需使用以下语法:

template<typename T1, typename Sequence1>
friend bool operator== (const stack<T1, Sequence1>&, const stack<T1, Sequence> &);

template<typename T1, typename Sequence1>
friend bool operator< (const stack<T1, Sequence1>&, const stack<T1, Sequence>&);

您需要第一个模板参数与 T 不同,第二个模板参数与 Sequence 不同,否则您将隐藏类的模板参数。

【讨论】:

以上是关于如何告诉编译器我的朋友函数是函数模板的主要内容,如果未能解决你的问题,请参考以下文章

泛函编程—模板函数_类模板

浅谈模板

如何在模板类函数中分配struct值?

C++学习_模板和泛型

深入理解函数模板

UE4 我的bug——模板函数