c++ 为什么使用命名空间时编译器找不到函数重载?

问题描述 投票:0回答:1

我有以下四个文件,

//struct.h
#pragma once
namespace coffee {
    class MD2 {};
    class Recorder{};
    class Book{};
}


//setup.h
#pragma once
#include "struct.h"
using namespace coffee;
void wire(MD2 md2, Book book){}

//strategy.h
#pragma once
#include "struct.h"
#include "setup.h"
namespace strategy {
    using namespace coffee;
    int wire(MD2 md2, Recorder recorder) {}
    int setup2(MD2 md2, Recorder recorder, Book book) {
        wire(md2, recorder);
        wire(md2, book); //<--compiler cant find this
    }
}

//main.cpp
#include <iostream>
#include "strategy.h"
int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

我的问题是在

using namespace coffee
之前,程序编译得很好,但是在添加
namespace coffee
之后,编译器找不到
wire(md2, book)
。 我可以知道为什么吗?

c++ namespaces
1个回答
0
投票

正如 Joel 在您的帖子的评论中指出的那样,您不应该 在 C++ 标头中使用命名空间

为了避免任何可能与您合作或使用您的代码的开发人员感到头疼,我也会避免同时使用

using namespace
,就像对于任何更大的代码库一样。

即使对于你的小代码示例,我也必须看两遍才能看到

Recorder
coffee
的一部分。简单地写出
coffee::Recorder
等,可以使代码更具可读性,并避免日后出现烦人的错误。

© www.soinside.com 2019 - 2024. All rights reserved.