c++ - namespace 函数未链接

标签 c++ function namespaces

我有一个这样的设置

文件.h:

#pragma once
namespace a {
    int home(double a, double b, ...
    class b {
        int la();
    };
}

文件.cpp

#include "file.h"    
using namespace a;

int home(double a, double b, ...) {
    //function stuff
}

int b::la() {
    home(1, 2, ...)
}

b 是这样在 main 中实例化和使用的:

#include "file.h"    
b instant;
instant.la()

但是我在使用函数 home 的任何地方都遇到了这个链接器错误:

undefined reference to `a::home(double, double, ...)'
In function a::b::la()

我非常确定所有 CMakelists 都已正确设置并且包含所有内容。

但是当我将 file.cpp 更改为位于命名空间中时:

namespace a {
    all of the same stuff
}

它工作得很好吗?

知道为什么会这样吗?

最佳答案

您的问题出在 file.cpp 顶部的 using namespace a; 上。这只是将 namespace a 中的所有定义拉入您的代码中。因此,当您定义 int home(double, double, ...) 时,您并不是在为 a::home 提供实现,而是在创建另一个函数.然后你有 int a::home(double, double, ...)int home(double, double, ...)

您要么需要 int a::home(double, double, ...) 要么将所有内容包装在 namespace a 下的 .cpp 文件中 命名空间 a { ... } 中。

编辑:您的困惑源于 using 声明的作用。它只是从 a 命名空间中提取所有内容,并允许您无限制地使用它。它不允许您在定义中省略限定条件。

关于c++ - namespace 函数未链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117699/

相关文章:

c++ - OpenGL 着色器未从 glVertexAttribPointer() 获取值

c++ - 如何让我的 makefile 覆盖一个文件?

javascript - 将作为参数传递的函数与数字关联起来

javascript - js 将值重新分配给函数中多个已声明的变量

Go Lang 工作区重复包名称可执行冲突

.net - SOAP 故障消息中的多个 namespace 导致FaultException反序列化失败

python - 多维数组索引C++中的多维数组

c++ - 从不同线程调用 recvfrom() 和 setsockopt() 添加/离开多播成员

javascript - 创建一个javascript对象,然后通过for循环填充一个数组

java - 从 XML 文件中获取命名空间