Как использовать класс, определенный в отдельном заголовке в пространстве имен - PullRequest
1 голос
/ 06 января 2012

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

main.cpp

#include <iostream>
namespace A {
    #include "C.hpp"
}

int main()
{
    A::C foo;
    std::cout << foo.member << std::endl;
    return 0;
}

C.hpp

class C {
    public:
     C();
     int member;
}

C.cpp

C::C()
{
    this->member = 10;
}

Когда я запускаю g++ C.cpp main.cpp, я получаю сообщение об ошибке «main.cpp :(. Text + 0x10): неопределенная ссылка на« A :: C :: C () ». Я предполагаю, что это определение C :: C () конструктора, которое как-то не так, но я не уверен, как это исправить.

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Вы также должны определить конструктор C внутри пространства имен A:

namespace A
{
    C::C()
    {
        this->member = 10;
    }
}
0 голосов
/ 06 января 2012
namespace A {
    #include "C.hpp"
}

Это очень странная вещь.

Это помещает все, что объявлено в заголовке, в пространство имен с именем A;в частности, он дает вам объявление A::C, которое отличается от класса ::C, который вы получаете, когда включаете заголовок без окружающего пространства имен.

Вы предоставили определение для ::C::C();но main.cpp требует определения для A::C::C(), так как это класс, который он использует.Это нигде не определено, поэтому ошибка.

Либо правильно вставьте C в namespace A, переместив пространство имен в файл заголовка (и исправьте C.cpp, чтобы использовать это пространство имен), либо избавьтесь от namespace A.

...