C++中命名空间中的函数出现未定义引用问题

4

这个问题困扰我有一段时间了。我有一个命名空间,在这个命名空间里我想声明C风格的函数。所以我做了我认为正确的事情:

namespace test
{
    std::deque<unsigned> CSV_TO_DEQUE(const char* data);
    std::deque<unsigned> ZLIB64_TO_DEQUE(const char* data, int width, int height);

    std::string BASE64_DECODE(std::string const& encoded_string);
}

然后是实现文件:
#include "theheaderfile.hpp"

using namespace test;

std::deque<unsigned> CSV_TO_DEQUE(const char* data)
{
     ...
}
std::deque<unsigned> ZLIB64_TO_DEQUE(const char* data, int width, int height)
{
     ...
}

std::string BASE64_DECODE(std::string const& encoded_string)
{
     ...
}

然而,当我尝试调用这些函数时,出现了未定义引用错误。文件已经被链接,所以我不确定为什么引用是未定义的。

我还想补充一点,如果我将这些函数从test命名空间中移除,保留在全局命名空间中,它们可以顺利运行。

我希望避免在头文件中定义这些函数,这是否可行?


C文件被添加到项目中了吗? - 4pie0
1
你只是在定义一个名称相似的新函数。你需要实际在命名空间中定义它们,可以通过像头文件中那样将定义包装在命名空间中,或者通过限定名称 std::deque<unsigned> test::CSV_TO_DEQUE(const char* data){/...} 来实现。 - BoBTFish
2个回答

11
< p >使用 using namespace 只会导入命名空间以供使用,它不会让你定义该命名空间中的函数。

你仍然需要在test命名空间内定义这些函数:

namespace test {
    // your functions
};

6

定义IT如下:

std::deque<unsigned> test::CSV_TO_DEQUE(const char* data)
{
     ...
}

否则,这只是全局命名空间中的一个新函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接