【问题标题】:Trouble with using namespace and static methods使用命名空间和静态方法的问题
【发布时间】:2015-08-26 19:50:47
【问题描述】:

我正在尝试编写一些命名空间静态方法和变量,以便拥有一组我可以在代码中的任何位置使用的函数。这就是我所拥有的: 标题:

namespace CProfileIO
{
    static void setAppDir(std::string appDir);
    static int reloadProfiles();

    static std::string directory;
    static std::list<std::string> profilesList;
}

来源:

namespace CProfileIO
{

void setAppDir(std::string appDir)
{
    directory = appDir;
}

int reloadProfiles()
{
    // ...
}

} // namespace CProfileIO

然后在我的代码中某处:

#include "CProfileIO.h"

int main(int argc, char * argv[])
{
    string appDir = string(dirname(*argv));
    CProfileIO::setAppDir(appDir);
    .
    .
    .
}

当我尝试编译时,我在使用函数的那一行出现错误:

... undefined reference to `CProfileIO::setAppDir(std::string)'

我不知道出了什么问题。我会获得所有帮助!

【问题讨论】:

标签: c++ class c++11 namespaces


【解决方案1】:

您不应在此处使用静态函数,因为它们仅在当前翻译单元中可见。因此,您声明了一个在 cpp 中(静态)定义的静态函数,那么它在其他翻译单元中将不可见。

您不应该在这里使用static 关键字,而是将变量(但不是函数)声明为extern

另外,我建议将字符串参数作为 const 引用传递 (void setAppDir(const std::string&amp; appDir);)

【讨论】:

  • 好吧,我不明白 c++ 中的静态与 c 中的相同。但是现在我真的很困惑我应该如何在命名空间中声明函数和变量以在任何地方访问它们。
  • 您可以像这样从命名空间访问函数:CProfileIO::setAppDir("something");
  • 我知道,但我不知道如何以“正确”的方式构造命名空间文件。现在我已经将函数定义从 .cpp 文件移动到 .h 文件,就像我在标准 c 中所做的那样,它可以工作,但看起来不太好。
  • 这里的做法完全没问题。
【解决方案2】:

那是因为静态方法只在当前模块中可见,(源文件)。它们没有链接。 因此,您的其他源文件找不到该功能。如果您使用静态,那应该会发生。我不知道您为什么要将裸函数声明为静态函数,也许您打算将它们放入一个类中?

【讨论】:

猜你喜欢
  • 2014-11-13
  • 2011-10-05
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2012-01-04
  • 2010-11-28
相关资源
最近更新 更多