命名空间函数不链接

时间:2013-01-02 06:20:45

标签: c++ function namespaces

我有这样的设置

file.h:

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

file.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
}

它运作得很好吗?

为什么会发生这种情况?

4 个答案:

答案 0 :(得分:7)

问题出在{。{1}}的文件顶部。这只是将using namespace a;中的所有定义都引入到您的代码中。因此,当您定义namespace a时,您没有为int home(double, double, ...)提供实现,而是创建了另一个函数。然后,您有a::homeint a::home(double, double, ...)

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

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

答案 1 :(得分:3)

你需要定义命名空间a中的函数,因为它是声明的

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

答案 2 :(得分:3)

namespace a内的file.cpp包装定义中,它将在命名空间a中定义它们,链接器可以找到符号。

namespace a{

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

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

} // namespace a

节点,using namespace a未定义您的函数inside namespace a

看看google c++ coding style guide,它提供了良好的c ++编码风格。

答案 3 :(得分:2)

home的定义需要说a::home,因为它是在其中声明的命名空间。因此未定义引用“a :: home”。

相关问题