我有一个这样的设置
文件.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/