gpt4 book ai didi

c++ - 为什么我不能在另一个文件中重载 << 运算符?

转载 作者:行者123 更新时间:2023-11-30 03:36:21 25 4
gpt4 key购买 nike

当我尝试从另一个文件重载 << 运算符时出现错误,我在其中使用该运算符但不明白为什么。

这段代码有效

(foo.hpp)

#ifndef FOO_HPP
#define FOO_HPP
enum class Foo { a, b };
#endif

(bar.cpp)

#include "foo.hpp"
#include <iostream>

std::ostream& operator<<(std::ostream& out, Foo x) {
switch(x) {
case Foo::a :
out << "a";
break;
case Foo::b :
out << "b";
break;
}
return out;
}

int main(int argc, char ** argv) {
Foo x {Foo::a};
std::cout << x << std::endl;
return 0;
}

(生成文件)

CC=g++
CFLAGS=--std=c++11 -Wall

bar : bar.o
$(CC) $(CFLAGS) bar.o -o bar

bar.o : bar.cpp foo.hpp
$(CC) $(CFLAGS) -c bar.cpp foo.hpp

(./bar 的输出)

a

现在,如果我创建 foo.cpp,并移动 std::ostream& operator<<(std::ostream& , Foo) 的定义在那里,并以这种方式修改我的 Makefile

CC=g++
CFLAGS=--std=c++11 -Wall

bar : bar.o foo.o
$(CC) $(CFLAGS) bar.o foo.o -o bar

foo.o : foo.cpp foo.hpp
$(CC) $(CFLAGS) -c foo.cpp foo.hpp

bar.o : bar.cpp foo.hpp
$(CC) $(CFLAGS) -c bar.cpp foo.hpp

它不起作用,我收到大量以

开头的编译器错误
bar.cpp: In function ‘int main(int, char**)’:
bar.cpp:6:13: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Foo’)
std::cout << x << std::endl;
^

和其他非常相似的错误。

为什么?

最佳答案

operator <<仍然是一个和其他函数一样的函数(有一些额外的属性)。它的声明必须在所有要使用它的文件中可见。因此,如果您将其定义从 main.cpp进入foo.cpp ,您需要在 foo.hpp 中为其声明:

std::ostream& operator<<(std::ostream& out, Foo x);

关于c++ - 为什么我不能在另一个文件中重载 << 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40742625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com