2

我有这样的设置

文件.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()

我很确定所有 CMakelist 都已正确设置,并且所有内容都包含在内。

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

namespace a {
    all of the same stuff
}

它工作得很好吗?

任何想法为什么会发生这种情况?

4

4 回答 4

8

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

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

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

于 2013-01-02T06:29:37.933 回答
3

您需要在命名空间内定义函数,a因为它是在其中声明的:

namespace a
{
    int home(double a, double b, ...) {
      //function stuff
    }
}
于 2013-01-02T06:26:15.347 回答
3

在 file.cpp 中包装定义namespace a,这将在命名空间中定义它们,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++ 编码风格。

于 2013-01-02T06:30:50.247 回答
2

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

于 2013-01-02T06:26:35.683 回答