C++ 使用命名空间与使用命名空间闭包的范围

C++ 使用命名空间与使用命名空间闭包的范围,c++,namespaces,declaration,definition,name-lookup,C++,Namespaces,Declaration,Definition,Name Lookup,我试图理解为什么在使用名称空间与显式声明名称空间外壳时,函数中存在歧义 Book.h头文件: #ifndef MYBOOK_BOOK_H #define MYBOOK_BOOK_H namespace mybook { void showTitle(); void showTableOfContents(); } #endif 导致歧义错误的My Implementation文件: Book.cpp 没有歧义错误的我的实现文件: Book.cpp #include "Bo

我试图理解为什么在使用名称空间与显式声明名称空间外壳时,函数中存在歧义

Book.h头文件:

#ifndef MYBOOK_BOOK_H
#define MYBOOK_BOOK_H 

namespace mybook
{
    void showTitle();
    void showTableOfContents();
}

#endif
导致歧义错误的My Implementation文件: Book.cpp

没有歧义错误的我的实现文件: Book.cpp

#include "Book.h"
#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

namespace mybook {

   void showTitle() {
       cout << "The Happy Penguin" << endl;
       cout << "By John Smith" << endl;
   }

   void showTableOfContents() {
        cout << "Chapter 1" << endl;
        cout << "Chapter 2" << endl;
   }
}
我认为Book.cpp的第一个场景应该可以工作,因为在开始时使用名称空间mybook声明意味着我现在要实现我在头文件中定义的函数。然而,我得到了错误“showtTitle”:对重载函数的不明确调用可能是“void showTitlevoid或void mybook::showTitlevoid”,对于我的其他函数showTableOfContents也是如此。为什么在第一个场景中使用名称空间mybook不起作用

我认为Book.cpp的第一个场景应该可以工作,因为在开始时使用名称空间mybook声明意味着我现在要实现我在头文件中定义的函数

这就是你不正确的地方。使用名称空间mybook;表示您正在使用mybook中的名称,而不是向mybook定义/添加名称。要在mybook中定义名称,您需要像在第二个示例中一样打开名称空间并将定义放入其中

我认为Book.cpp的第一个场景应该可以工作,因为在开始时使用名称空间mybook声明意味着我现在要实现我在头文件中定义的函数

这就是你不正确的地方。使用名称空间mybook;表示您正在使用mybook中的名称,而不是向mybook定义/添加名称。要在mybook中定义名称,您需要像在第二个示例中一样打开名称空间并将定义放入其中。

这些定义

using namespace std;
using namespace mybook;

void showTitle() {
    cout << "The Happy Penguin" << endl;
    cout << "By John Smith" << endl;
}

void showTableOfContents() {
     cout << "Chapter 1" << endl;
     cout << "Chapter 2" << endl;
}
非限定名称查找将查找所有四个函数。因此,编译器会报告歧义

如果要定义在名称空间mybook中声明的函数,则必须编写

using namespace std;
using namespace mybook;

void mybook::showTitle() {
    cout << "The Happy Penguin" << endl;
    cout << "By John Smith" << endl;
}

void mybook::showTableOfContents() {
     cout << "Chapter 1" << endl;
     cout << "Chapter 2" << endl;
}
它的产量是

::f1();
::f2();
如果你愿意写信

mybook::f1();
mybook::f2();
然后,如果未定义函数,则会出现错误。

这些定义

using namespace std;
using namespace mybook;

void showTitle() {
    cout << "The Happy Penguin" << endl;
    cout << "By John Smith" << endl;
}

void showTableOfContents() {
     cout << "Chapter 1" << endl;
     cout << "Chapter 2" << endl;
}
非限定名称查找将查找所有四个函数。因此,编译器会报告歧义

如果要定义在名称空间mybook中声明的函数,则必须编写

using namespace std;
using namespace mybook;

void mybook::showTitle() {
    cout << "The Happy Penguin" << endl;
    cout << "By John Smith" << endl;
}

void mybook::showTableOfContents() {
     cout << "Chapter 1" << endl;
     cout << "Chapter 2" << endl;
}
它的产量是

::f1();
::f2();
如果你愿意写信

mybook::f1();
mybook::f2();

如果没有定义函数,则会出现一个错误。

永远不要使用名称空间std。你不应该试图找出如何让它工作,而应该摆脱这种做法。并且不要使用C头,例如cstring。使用C++中的字符串和适当的工具。埃里克评论的一些上下文:注意有些人不同意使用NoStEdStd@ RoME的想法,而这是一个好的建议:更喜欢STD::在C字符串上使用字符串,一般不使用C标题不是好建议。例如,使用来自、和许多其他人的东西没有什么错。在OP的情况下,尽管它目前未被使用,但也有有效的使用,因为它提供的大部分函数没有C++等价物。我不应该这样说。永远不要使用namespace std。你不应该试图找出如何让它工作,而只是摆脱这种做法。不要使用C头,比如cstring。使用C++中的字符串和适当的工具。埃里克评论的一些上下文:注意有些人不同意使用NoStEdStd@ RoME的想法,而这是一个好的建议:更喜欢STD::在C字符串上使用字符串,一般不使用C标题不是好建议。例如,使用来自、和许多其他人的东西没有什么错。在OP的情况下,尽管它目前未被使用,但也有有效的使用,因为它提供的大部分函数没有C++等价物。我不应该那样说。谢谢你,这些例子帮助我说明了我在理解上的错误。谢谢你,这些例子帮助我说明了我在理解上的错误。