2010-01-17 125 views
6

我在头文件中有以下内容。对非成员函数的未定义引用 - C++

namespace silc{ 
    class pattern_token_map 
    { 
     /* Contents */ 
    }; 

    pattern_token_map* load_from_file(const char*); 
} 

在CPP文件(这已得到妥善包括)

pattern_token_map* load_from_file(const char* filename) 
{ 
    // Implementation goes here 
} 

在另一个CPP文件。这已经得到了所有适当的包括。

void some_method() 
{ 
    const char* filename = "sample.xml"; 
    pattern_token_map* map = load_from_file(filename); // Linker complains about this. 
} 

我得到一个链接错误说未定义的引用load_from_file。我无法看到这里出了什么问题。

任何帮助,将不胜感激。

编译器:G ++ OS:Ubuntu 9.10的

编辑

这里是用于连接器的命令。

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out src/phonetic_kit/pattern_token_map.o tests/pattern_token_map_tests.o tests/main.o -lUnitTest++ 

误差是pattern_token_map_tests.o和功能在pattern_token_map.o可用。所以我猜想链接的顺序不会造成问题。 (我已经从命令中删除了一些文件来简化它)

+0

你失踪'some_method'的括号? – 2010-01-17 17:31:58

+1

不可能从您发布的内容中知道 - 请添加您正在使用的编译器/链接器命令。 – 2010-01-17 17:34:41

+0

谢谢尼尔。我已经添加了我正在使用的链接器命令。这是我所拥有的简化版本。 – 2010-01-17 17:36:50

回答

9

当你实现它,你必须确保你实施正确的功能:

namespace silc { 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 
} 

如果不是这样做:

using namespace silc; // to get pattern_token_map 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 

然后你会定义一个新功能而不是silc :: load_from_file。

避免使用指令(“用命名空间...;”)的功能范围之外,作为一般准则:

using namespace silc; // outside function scope: avoid 

silc::pattern_token_map*      // qualify return type 
random_function(silc::pattern_token_map* p) { // and parameters 
    using namespace silc; // inside function scope: fine 
    pattern_token_map* p2 = 0; // don't have to qualify inside the function 
          // if you want to use the using directive 
    silc::pattern_token_map* p3 = 0; // but you can always do this 
    return 0; 
} 
+0

谢谢。通过说“避免在函数之外使用指令(”使用名称空间...;“),”你的意思是避免将它写在cpp文件之上。代之以写入每个函数。这是你的意思吗? – 2010-01-17 18:01:07

+1

是的,如果你想在一个函数中使用它,那很好。反正你很少需要它,因为你可以在我的第一段代码中使用表单来在cpp文件中实现你的函数。 – 2010-01-17 18:19:18

+1

我没有想过在函数体内限制'using'指令。 +1 – 2010-01-17 18:27:10

0

在你的链接阶段,你是否链接了通过编译第一个cpp文件而创建的目标文件?当一个对象引用一个未包含在被链接的对象中的符号时,会出现类似这样的链接器错误。

编辑:我仍然有理由相信这是问题所在。在第一个文件中,是否有预处理器符号重新定义load_from_file?

+0

是的。我链接所有的对象文件。添加了链接器命令。请看一看。 – 2010-01-17 17:38:20

相关问题