c++-C++函数模板中使用输出流出现 operator<< 不明确错误

问题描述

C++函数模板中使用输出流出现 operator<< 不明确错误
 #include<iostream>
#include<set>
#include<string>
using namespace std;
template<class T>
void print(T first, T last)
{
    for (; first != last; ++first)
    {
        cout<<*first<<" ";

        /*在类IntSet中重载了<<,为什么还会出现operator<<不明确错误 ? ? ?*/

    }
    cout << endl;
}

class IntSet
{
public:
        int x;
        bool exist;
        IntSet(int Integer) :x(Integer)
        {
            exist = true;
        }
        friend bool operator <(const IntSet &t1,const IntSet &t2);
        friend ostream & operator <<(ostream o, const IntSet &t);
        void setfalse()
        {
            exist = false;
        }
};

IntSet & operator *(IntSet &t)
{
    return t;
}

bool operator <(const IntSet &t1,const IntSet &t2)
{
    return t1.x < t2.x;
}
ostream & operator <<(ostream &o, const IntSet &t)
{
    if (t.exist)
    {
        o << t.x;
        return o;
    }
    else
    {
        return o;
    }
}

typedef multiset<IntSet> MY_SET;
typedef multiset<IntSet>::iterator my_iter;

int main()
{
    MY_SET ms;
    int Integer;
    string cmd;
    int iter;
    cin >> iter;
    while (iter)
    {
        cin >> cmd;
        if (cmd == "add")
        {
            cin >> Integer;
            ms.insert(IntSet(Integer));
            cout << ms.count(IntSet(Integer)) << endl;

            print(ms.begin(),ms.end());
        }
        else if (cmd == "del")
        {
            cin >> Integer;
            cout << ms.count(IntSet(Integer)) << endl;
            my_iter p;

            pair<my_iter, my_iter> bounds = ms.equal_range(IntSet(Integer));

            for (p = bounds.first; p != bounds.second; p++)
                 const_cast<IntSet&>(*p).setfalse();
            print(ms.begin(), ms.end());
        }
        else if (cmd == "ask")
        {
            cin >> Integer;
            my_iter p;
            pair<my_iter, my_iter> bounds = ms.equal_range(IntSet(Integer));
            int num=0;
            for (p = bounds.first; p != bounds.second; p++)
            {
                if (p->exist) num++;
            }
            if (ms.count(Integer))
            {
                cout << 1 << " "<<num<<endl;
            }
            else
            {
                cout << 0 << " "<<0<<endl;
            }
        }
        iter--;
    }
    return 0;
}

解决方案

IntSet & operator *(IntSet &t)
{
return t;
}
你这个重载的是乘法,不是取地址

时间: 2024-09-28 23:10:53

c++-C++函数模板中使用输出流出现 operator&amp;lt;&amp;lt; 不明确错误的相关文章

深入解析C++中的函数模板和函数的默认参数_C 语言

C++函数模板 我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值.这就是数据的参数化. 其实,数据类型也可以通过参数来传递,在函数定义是可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的参数自动确定数据类型.这就是数据类型参数化. 所谓函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替(实际上是用一个标识符来占位).这个通用函数就称为函数模板(Function Template).凡是函数

C++中函数模板的用法详细解析_C 语言

定义 我们知道函数的重载可以实现一个函数名多用,将功能相同或者类似函数用同一个名来定义.这样可以简化函数的调用形式,但是程序中,仍然需要分别定义每一个函数. C++提供的函数模板可以更加简化这个过程. 所谓函数模板实际上是建立一个通用函数,其涵涵素类型额形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板. 凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需要在模板中定义一次即可.在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能

简单掌握C++中的函数模板_C 语言

1.函数模板的声明和模板函数的生成 1.1函数模板的声明函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板的声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 } 其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,用

c#新手,在一个xna模板中看到一个按键函数,看不懂,求前辈指点

问题描述 c#新手,在一个xna模板中看到一个按键函数,看不懂,求前辈指点 public bool IsNewKeyPress(Keys key, PlayerIndex? controllingPlayer, out PlayerIndex playerIndex) { if (controllingPlayer.HasValue) { // Read input from the specified player. playerIndex = controllingPlayer.Value;

模板函数-函数模板在头文件和main函数中应该怎么写

问题描述 函数模板在头文件和main函数中应该怎么写 第一次写,提示找不到标示符max,求指正 解决方案 即便在外部文件中定义了max,也应该在引用文件中extern声明后再使用 另外你的max.h文件中将你的3到10行代码屏蔽了,改为: #ifndef MAX_H #define MAX_H 解决方案二: main函数究竟应该怎么写?main函数究竟应该怎么写?c++模板类/模板函数的声明与定义应该放在头文件里

函数模板 结构体数组-C++中带有数组参数的函数模板是否可以实例化为结构体数组类型来进行比较等操作?

问题描述 C++中带有数组参数的函数模板是否可以实例化为结构体数组类型来进行比较等操作? 不管什么类型的数组,都有一些类似的操作,因此可以使用函数模板实现代码复用.但是我在实现"查找"功能时不知道怎么处理结构体数组.要保证函数模板不仅适用于结构体数组,还适用于其他数组.求助各位大神! #include using namespace std; #define N 10 struct stu { int num; double score; }; /*查找:查找某元素,返回其下标*/ t

c++ 函数模板重载-关于c++中函数模板的重载问题

问题描述 关于c++中函数模板的重载问题 直接上代码(简单),enter code here template< class T > void test(T x){ cout<<x<<endl; } void test(int); int main(){ int x = 1; test(x); } 上述程序使用非模板函数对函数模板test进行重载:按照书中的说法-这个非模板函数可以只声明原型,然后借用模板中定义的函数体. 但是链接的时候找不到那个非模板函数的定义(使用的

Thinkphp模板中使用自定义函数的方法_php实例

注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### } 说明: { 和 $ 符号之间不能有空格,后面参数的空格就没有问题: ###表示模板变量本身的参数位置 : 支持多个函数,函数之间支持空格 : 支持函数屏蔽功能,在配置文件中可以配置禁止使用的函数列表 : 支持变量缓存功能,重复变量字串不多次解析. 使用例子: {$webTitle|md5|st

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型. 案例如下: #include<iostream> #include<stdlib.h>   voidmain() {    doubledb = 10.9;    double *pdb = &db;    autonum =pdb;    //通过typeid的方式获得数据类型    std::cout << typeid(db).name() << std::e