多文件命名空间

3

在FileThree.h文件内部

#ifndef FILETHREE
#define FILETHREE
namespace blue{}
class Filethree
{
public:
    Filethree(void);
    ~Filethree(void);
};
#endif

在FileThree.cpp文件内部

#include "Filethree.h"
#include<iostream>
using namespace std ;
namespace blue{
     void blueprint(int nVar){
         cout<<"red::"<<nVar<<endl;
     }
}
Filethree::Filethree(void)
{
}

Filethree::~Filethree(void)
{
}

在 FileFour.h 文件内

#ifndef FILEFOUR
#define FILEFOUR
namespace red{}
class FileFour
{
public:
    FileFour(void);
    ~FileFour(void);
};
#endif

在 FileFour.cpp 文件内部
#include "FileFour.h"
#include<iostream>
using namespace std; 
 namespace red{
     void redprint(double nVar){
         cout<<"red::"<<nVar<<endl;
     }
}
FileFour::FileFour(void)
{
}

FileFour::~FileFour(void)
{
}

在 main.cpp 文件内

#include "FileFour.h"
 #include "Filethree.h"
using namespace red ;
using namespace blue ;

int main()
{
    blueprint(12);
return 0;
}

当我编译上述文件时,它给了我以下错误。
 error C3861: 'blueprint': identifier not found

有人能告诉我为什么会出现这个错误吗?
3个回答

7

当函数没有在头文件中声明时,编译器找不到这些函数。

您需要在FileThree.h文件中的blue命名空间中声明blueprint函数。

FileThree.h:

namespace blue{
    void blueprint(int nVar);
}

redprint函数同样,需要在red命名空间内的FileFour.h文件中声明它。
namespace red{
   void redprint(double nVar);
}

但是我已经在cpp文件中声明了相同的内容,并在头文件中给出了前向声明。我有什么遗漏吗? - Viku
1
你没有理解我的意思。:) 在 .cpp 文件中的定义在链接时可见。 - billz
只有头文件编译,链接时它们会与cpp文件链接以获取定义。如果我错了,请纠正我。 - Viku
1
main中调用blueprint函数之前,编译器必须先看到blueprint的名称才能使用它。这可以来自函数的声明或定义。在任何程序中,您可以有尽可能多的函数重新声明,但只有一个定义。这就是为什么我们将代码拆分成.h.cpp文件的原因。我们将声明保留在头文件(大体上),而将定义保留在cpp文件中。编译器编译cpp文件,但拉入头文件以查看函数的声明。 - Peter Wood
1
@PeterWood:感谢您让我对编译和链接过程的理解更加清晰。 - Viku

0

在 FileFour.h 内部

#ifndef FILEFOUR
#define FILEFOUR
namespace red{
     void redprint(int nVar);        
}
class FileFour
{
public:
    FileFour(void);
    ~FileFour(void);
};
#endif

在FileFour.cpp文件内

#include "FileFour.h"
#include<iostream>
using namespace std; 
void red::redprint(int nVar)
{
    cout<<"red"<<nVar<<endl;
}
FileFour::FileFour(void)
{
}

FileFour::~FileFour(void)
{
}

在 Filethree.h 文件内

#ifndef FILETHREE
#define FILETHREE
namespace blue{
     void blueprint(int nVar);       
}
class Filethree
{
public:
    Filethree(void);
    ~Filethree(void);
};
#endif

在 Filethree.cpp 内部

#include "Filethree.h"
#include<iostream>
using namespace std ;
void blue::blueprint(int nVar)
{
    cout<<"blue"<<nVar<<endl;
}
Filethree::Filethree(void)
{
}

Filethree::~Filethree(void)
{
}

在 main.cpp 文件内

#include <iostream>
using namespace std;
#include "FileFour.h"
 #include "Filethree.h"
using namespace blue ;
int main()
{
    blueprint(12);
return 0;
}

定义应包含在cpp文件中,而声明应在头文件中。


在FileThree.h和FileFour.h中删除“extern”。 - billz
删除extern关键字后,代码将不会出现任何错误。请查看我编辑过的帖子。 无论如何,感谢您提供的链接,这有助于我理解编译和链接过程。 - Viku

0
当您将代码分为多个文件时,您必须在头文件和源文件中使用命名空间。
add.h

#ifndef ADD_H
#define ADD_H

namespace basicMath
{
    // function add() is part of namespace basicMath
    int add(int x, int y);
}

#endif
add.cpp


#include "add.h"

namespace basicMath
{
    // define the function add()
    int add(int x, int y)
    {
        return x + y;
    }
}
main.cpp


#include "add.h" // for basicMath::add()

#include <iostream>

int main()
{
    std::cout << basicMath::add(4, 3) << '\n';

    return 0;
}

来源:https://www.learncpp.com/cpp-tutorial/user-defined-namespaces/comment-page-4/#comment-464049


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接