命名空间的C++继承问题

JDW*_*JDW 1 c++ virtual inheritance namespaces

好吧,我一直在寻找,但不能为我的智慧找到一个理由,为什么这不应该工作:

基类(misc/interface/handler.h)

#ifndef __t__MISC_VIRTUAL_HANDLER_H
#define __t__MISC_VIRTUAL_HANDLER_H
#pragma message("Starting with 'handler.h'")

namespace t {
    namespace misc {
        namespace interface {
            class Handler {
                public:
                    Handler();
                    virtual ~Handler();

                    virtual int setup() = 0;
                    virtual int teardown() = 0;
                    virtual int update() = 0;
                protected:
                private:
            };
        }
    }
}

#pragma message("Ending with 'handler.h'")
#endif // __t__MISC_VIRTUAL_HANDLER_H
Run Code Online (Sandbox Code Playgroud)

派生类(graphics/handler.h):

#ifndef __t_GRAPHICS_HANDLER_H
#define __t_GRAPHICS_HANDLER_H

#include "../misc/interface/handler.h"

namespace t {
    namespace graphics {
        class Handler: public t::misc::interface::Handler {
            public:
                Handler();
                virtual ~Handler();

                int getResolutionX() { return m_resolutionX; }
                int getResolutionY() { return m_resolutionY; }
                bool getFullscreen() { return m_isFullscreen; }

            protected:
            private:
                unsigned int m_resolutionX, m_resolutionY;
                bool m_isFullscreen;

        }; // class Handler
    } // namespace graphics
} // namespace t
#endif // __t_GRAPHICS_HANDLER_H
Run Code Online (Sandbox Code Playgroud)

......这似乎相当微不足道.

派生类实现(graphics/handler.cpp):

#include "handler.h"

t::graphics::Handler::Handler(): t::misc::interface::Handler() {

}

t::graphics::Handler::~Handler() {
}
Run Code Online (Sandbox Code Playgroud)

......这也应该是微不足道的,但会产生错误:

src\graphics\handler.cpp|5|undefined reference to `t::misc::interface::Handler::Handler()'
Run Code Online (Sandbox Code Playgroud)

我正在使用带有代码块的MinGW以及CB使用的标准设置,我尝试使用测试类构建相同的情况,并且按照预期工作,无论是在相同的环境中还是使用带有vanilla g ++的Linux.

Kos*_*Kos 5

t::misc::interface::Handler::Handler()在代码中看不到任何实现- 它将由继承类的构造函数调用,因此它需要一个实现.链接器找不到它,所以抱怨.

只是改变:

Handler();
virtual ~Handler();
Run Code Online (Sandbox Code Playgroud)

在抽象类中:

Handler() {}
virtual ~Handler() {}
Run Code Online (Sandbox Code Playgroud)

你准备好了.