2010-09-18 7 views
0

Правилен ли следующий подход? Ну, я получаю ошибку компиляции.включает внутри пространства имен

a.hpp является

#include <iostream> 

class a 
{ 

public: 

void classa_f(); 


}; 

a.cpp является

#include "a.hpp" 


void a::classa_f() 
{ 

    std::cout<< "a::classa_f\n"; 


} 

main.cpp

#include <iostream> 
namespace myname { 
#include "a.hpp" 
} 

int main() 

{ 

    myname::a obj; 
    obj.classa_f(); 

    return 0; 

} 

Я получаю следующую ошибку

г ++ main.cpp ао /tmp/ccOO f5s7.o: В функции main': main.cpp:(.text+0x11): undefined reference to MyName :: A :: classa_f()» collect2: л.д. возвращается 1 выход статус

Ну мой вопрос, можно ли иметь только включает в пространстве имен, но не фактическая реализация , потому что я вижу, что компилятор ищет пространство имен для определения функции. На самом деле это не так.

+0

Почему вы включаете его в пространство имен? – GManNickG

+0

Решения, предлагаемые в ответах, конечно, правильны, но если вы хотите придерживаться своего подхода, тогда вы должны определить 'a :: classa_f()', присвоив ему имя пространства имен, то есть 'void myname :: a :: classa_f() {/ ...} ' –

ответ

2
namespace myname { 
    #include "a.hpp" 
} 

Объявляет метод класса myname::a::classa_f, который, очевидно, не существует в вашей программе. Это неверно.

0

В реализации, вы должны

namespace myname 
{ 
    void a::classa_f() 
    { 
     std::cout<< "a::classa_f\n"; 
    } 
} 

и удалите #include <iostream> из файла HPP, он импортируется в пространство имен тоже.

+0

У меня возникли проблемы с согласованием« не включайте в файл hpp, он импортируется в пространство имен «с заголовочными файлами дизайна» должен включать все, от чего они зависят ». –