C ++认为'<<<不是班级的成员,但它是

时间:2009-09-25 08:01:41

标签: c++ operator-overloading

我必须编写一个简单的日志类,将输出写入文件。

我希望它能够重载<<运营商,所以我可以这样做:

MyLog log("C:\\log.txt");
log<<"Message";

但Visual C ++告诉我:“错误C2039:'&lt;&lt;' :不是'MyLog'的成员“

我不知道我做错了什么。

以下是代码:

MyLog.h

#pragma once
#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;

class MyLog
{
private:
    ofstream logfile;
public:
    MyLog(char* filename);
    friend MyLog& operator<<(MyLog& l,char*msg);
};

MyLog.cpp

#include "MyLog.h"

MyLog::MyLog(char* filename)
{
    logfile.open(filename);
}

MyLog& MyLog::operator<<(MyLog& l,char*msg)
{
    cout<<msg;
    return l;
}

有谁知道出了什么问题?

6 个答案:

答案 0 :(得分:19)

您已将自由函数MyLog& operator<<(MyLog& l,char* msg)声明为friend类的MyLog。它不是类本身的成员,所以你对函数的定义应该从这开始:

MyLog& operator<<(MyLog& l,char* msg)
{
   //...

答案 1 :(得分:2)

Visual C ++是对的,您的operator<<确实不是类MyLog的成员。尝试将其作为成员函数而不是单独的功能:

class MyLog {
    // ...

public:
    MyLog& operator<<(int i);
}

MyLog& MyLog::operator<<(int i) {
    cout << i;
    return *this;
}

答案 2 :(得分:0)

您尝试输出char *:

登录&LT;&LT; “消息”;

但是只为你的运算符定义了int:

MyLog&安培; MyLog :: operator&lt;&lt;(MyLog&amp; l,int i)

我猜错误信息也说“或者没有可接受的转换”

答案 3 :(得分:0)

这里你为int声明了<<运算符,并且你试图传递一个char *。

尝试声明char *重载:

MyLog& operator<<(MyLog& l,char* msg);

顺便说一下,你为什么宣称它是friend

答案 4 :(得分:0)

尝试修改

friend MyLog& operator<<(MyLog& l,int i);

MyLog& operator<<(MyLog& l,int i);

答案 5 :(得分:0)

你已经宣布了运营商&lt;&lt;作为MyLog成员的朋友。这有效:

MyLog&安培;运算符&lt;&lt;(MyLog&amp; l,int i) {     COUT&LT;