【问题标题】:Define in a namespace a function already defined in a cpp file在命名空间中定义已在 cpp 文件中定义的函数
【发布时间】:2021-04-26 09:34:43
【问题描述】:

我的目标是在命名空间中从function.cpp 声明一个现有函数,这样我就可以避免名称重复。我不想在命名空间内定义函数,而是在单独的文件(在本例中为 function.cpp)。我创建了以下示例来代表我在此案例中的努力。

我是 C++ 新手,我可能在定义中做错了什么,不幸的是我似乎没有找到问题所在。任何帮助将不胜感激。

//Header.h

int adder(int a, int b);
//Function.cpp

#include "Header.h"

int adder(int a, int b) {
    return (a + b);
}
//Namespace.h
#include "Header.h"

namespace orange {
    int adder(int a, int b);
}
//Main.cpp
#include <iostream>
#include "Namespace.h"
using namespace orange;

int main() {
    std::cout << orange::adder(7, 5) << "\n";
}

【问题讨论】:

  • 您不能将定义(或声明)“移动”到命名空间。函数(和变量)必须在命名空间内声明和定义才能开始。
  • 澄清一下,您想在命名空间中声明一个现有函数吗?
  • @user1810087 是的,这正是我想要实现的目标。
  • “我不想在命名空间内声明函数”顺便说一句,你已经用 ` namespace orange { int adder(int a, int b); } `
  • 好吧,这是非常不推荐的,因此我不会回答你的问题,但是可以使用一些 hacky 包含技巧将函数“移动”到命名空间中. 注意:如果你使用这种技术,你会遇到问题! 这个想法是将include 的东西放到命名空间中,不要使用原始的标头和实现。不能不使用这个,但看看this example....

标签: c++ namespaces


【解决方案1】:

问题就在这里。

使用橙色命名空间;

你已经包含了"Namespace.h",它已经包含了"Header.h",所以在你的 Main.cpp 文件中你实际上有

int adder(int a, int b);

namespace orange {
    int adder(int a, int b);
}

这很好,你可以在不同的命名空间中拥有同名的函数,第一个在全局命名空间中,第二个在orange命名空间中。

当您说 using namespace orange; 时,您会将所有内容从该文件​​中的橙色命名空间带到全局命名空间,而现在,您基本上在同一个地方有两个 int adder(int a, int b);

当您尝试调用该函数时,编译器会感到困惑,他可以同时调用两者,但不知道您真正想要哪个。

要克服这个问题,你不应该使用using namespace orange;,而是在实际调用中指定你要调用的函数,如果是全局函数,那么就调用

std::cout << adder(7, 5) << "\n";

如果函数定义在orange命名空间中,则这样调用

std::cout << orange::adder(7, 5) << "\n";

【讨论】:

  • 您好!非常感谢您的回答!我在我的 project.exe 中收到链接错误 LNK1120,用于未解决的外部问题。似乎“找不到'adder'的函数定义”是问题所在。
  • 你没有orange::adder函数的定义,只有声明。
  • 是否可以将function.cpp 中的定义与命名空间标头“链接”?
  • 你也可以在Namespace.h中定义函数,不仅要声明,而且你应该把那个函数写成static,否则你会得到多重定义错误。
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
相关资源
最近更新 更多