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

超级

这是我的代码:

#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>&);

我该怎么解决。

rems4e

只需使用以下语法:

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,否则您将遮蔽该类的模板参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译器如何确定要调用的函数模板?

C ++ gcc函数模板重载编译器问题

隐藏成员函数模板-哪个编译器正确?

成员函数模板推导指南或其他方法,以使编译器知道如何调用函数

如何告诉编译器我的函数像process :: exit()一样终止程序?

编译器跳过C ++中的可变参数模板/函数

可变参数模板和函数的指针:哪种编译器正确?

使库函数模板化以避免编译器指令是否有益?

我可以告诉我的编译器忽略语句或函数的副作用吗?

如何告诉编译器在每个C函数上填充特定数量的字节?

如何告诉编译器在_Noreturn函数中的内联汇编后不生成“ retq”?

我如何“告诉” C编译器不应优化代码?

如何让编译器处理这个函数?

我可以要求编译器禁止定义模板类成员函数的通用版本吗?

调用函数模板时是否可以仅指定一些模板参数,让编译器推断其他参数

如何使编译器比Swift常规函数更喜欢我的函数?

编译器无法推断出模板函数的类型?

如何将可变参数模板函数* instance *声明为朋友

是编译器还是我自己:从包含lambda的可变参数模板继承

在 OCAML 中的函数中获取随机数或告诉编译器每次评估函数

如何允许编译器为模板化的 get 函数推导出正确的返回类型?

编译器如何在不更改参数列表的情况下重载模板函数?

编译器如何不使用size参数处理此模板化函数

如何使编译器为我推断正确的模板整数

为什么我的编译器创建重复的汇编函数

我的“ stoi”函数或编译器有问题吗?

编译器警告我的函数将永远不会执行

编译器在我的函数参数中寻找额外的属性

如何让Kotlin编译器知道我已经在函数内部检查过null?