【问题标题】:namespace functions not linking命名空间函数未链接
【发布时间】:2012-12-16 13:31:13
【问题描述】:

我有这样的设置

文件.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
}

而且效果很好?

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

【问题讨论】:

    标签: c++ function namespaces


    【解决方案1】:

    你需要定义命名空间a中的函数,因为它在哪里被声明:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但我是using namespace a 所以我认为我不需要?
      • 确实可以。就像其他人在回答中所说的那样,using namespace 只是导入命名空间中的所有声明。它不会将您放入该名称空间中。所以你仍然需要编写int a::home(...) 来定义 a 命名空间内的函数。
      【解决方案3】:

      您的问题在于您的 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, ...),要么将.cpp 文件中的所有内容包装在namespace a 下的namespace a { ... } 中。

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

      【讨论】:

        【解决方案4】:

        在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++编码风格。

        【讨论】:

          猜你喜欢
          • 2017-05-28
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 2010-12-25
          • 1970-01-01
          • 2010-09-14
          • 2016-03-29
          相关资源
          最近更新 更多