2013-06-03 36 views
1

我試圖使用一些功能的自定義命名空間。當我編譯我的測試文件,我得到下面的連接錯誤:鏈接器錯誤與我的自定義命名空間

Undefined      first referenced 
symbol        in file 
Direction_ns::operator<<(std::basic_ostream<char, std::char_traits<char> >&, Direction_ns::Direction) /var/tmp//cc3entPx.o 
ld: fatal: symbol referencing errors. No output written to a.out 
collect2: error: ld returned 1 exit status 

這是我的頭:

#ifndef DIRECTION_H 
#define DIRECTION_H 
#include <iostream> 
#include <stdexcept> 
#include <string> 

namespace Direction_ns{ 
    enum Direction { Up, Down, Left, Right }; 

    extern std::ostream& operator<<(std::ostream&, const Direction); 
    extern std::istream& operator>>(std::istream&, Direction&); 

    class bad_direction : public std::runtime_error{ 
    public: 
    explicit bad_direction(const std::string& what_arg) 
     : runtime_error(what_arg) {} 
    }; 
} 
#endif 

這是我的源:

#include <iostream> 
#include <string> 
#include "Direction.h" 

using namespace std; 


ostream& Direction_ns::operator<<(ostream& o, const Direction d){ 
    string s; 

    switch (d){ 
    case 0: 
    s = "Up"; 
    break; 
    case 1: 
    s = "Down"; 
    break; 
    case 2: 
    s = "Left"; 
    break; 
    case 3: 
    s = "Right"; 
    break; 
    default: 
    throw bad_direction("Out of range"); 
    break; 
    } 
    o << s; 
    return o; 
} 

istream& Direction_ns::operator>>(istream& i, Direction & d){ 
    string str; 
    if(!(i >> str)) 
    return i; 
    if(str == "Up") 
    d = static_cast<Direction>(0); 
    else if(str == "Down") 
    d = static_cast<Direction>(1); 
    else if(str == "Left") 
    d = static_cast<Direction>(2); 
    else if(str == "Right") 
    d = static_cast<Direction>(3); 
    else 
    throw bad_direction("Out of range"); 
    return i; 
} 

,這是測試文件:

#include <iostream> 
#include "Direction.h" 

using namespace std; 
using namespace Direction_ns; 

int main() 
{ 

    for (Direction d = Up; d <= Right; d = static_cast<Direction>(d + 1)) 
    { 
     cout << d << '\n'; 
    } 

    return 0; 
} 
+0

你是如何構建你的二進制文件?我設法編譯你的代碼 – Xaqq

回答

0

你可能忘記了建立Direction.cpptest.cpp

g++ test.cpp Direction.cpp在我的環境中工作正常(gcc版本4.7.2(Debian 4.7.2-5))。

然而,試圖建立以下錯誤只TEST.CPP結果:

test.cpp:(.text+0x1c): undefined reference to `Direction_ns::operator<<(std::ostream&, Direction_ns::Direction)'` 
0

頭說,operator<<(std::stream&, const Direction)在命名空間Direction_ns定義。第一個源文件在全局名稱空間中的定義爲operator<<(std::stream&, const Direction)。命名空間Direction_ns中沒有定義。