包括从QObject继承的文件时出现编译错误

时间:2019-03-11 16:23:17

标签: c++ qt cmake

我有3个课程

// service.h
#ifndef SERVICE_H
#define SERVICE_H
#include "controller.h"

class Service
{
    Controller controller;
public:
    void request();
};

#endif /* SERVICE_H */

名为Scheduler的第二个类

// scheduler.h
#ifndef SCHEDULER_H
#define SCHEDULER_H

#include <QTimer>
#include "service.h"

class Scheduler : public QObject
{
    Q_OBJECT
    static const int frequency = 5000;
    QTimer *timer;
    Service service;
public:
    Scheduler();

public slots:
    void process();
};    
#endif /* SCHEDULER_H */

和第三个名为Controller的控制器定义如下

// controller.h
#ifndef CONTROLLER_H
#define CONTROLLER_H

// system include
#include <QObject>


class Controller : public QObject
{
    Q_OBJECT

public:
    virtual ~Controller();
};

#endif // CONTROLLER_H

对于我的实现部分

// controller.cpp
#include "controller.h"

Controller::~Controller()
{
}

第二个文件

// scheduler.cpp
#include "scheduler.h"

Scheduler::Scheduler()
{
    // create a timer
    timer = new QTimer();

    // setup signal and slot connection
    connect(timer, SIGNAL(timeout()), this, SLOT(process()));

    timer->start(frequency); 
}

void Scheduler::process()
{
}

和服务源文件

// service.cpp
#include "service.h"

void Service::request()
{
}

最后,主要功能定义如下

// main.cpp
#include <QCoreApplication>
#include "scheduler.h"

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    // create the scheduler instance
    Scheduler scheduler;

    // event loop
    return a.exec();
}

该示例非常简单,但是在尝试编译时总是收到以下错误消息:

$ make
[  7%] Automatic moc for target project
[  7%] Built target project_automoc
[ 15%] Generating __/inc/moc_controller.cpp
Scanning dependencies of target project
[ 23%] Building CXX object src/CMakeFiles/project.dir/scheduler.cpp.o
[ 30%] Building CXX object src/CMakeFiles/project.dir/service.cpp.o
In file included from /usr/include/i386-linux-gnu/qt5/QtCore/qtypeinfo.h:34:0,
             from /usr/include/i386-linux-gnu/qt5/QtCore/qglobal.h:1098,
             from /usr/include/i386-linux-gnu/qt5/QtCore/qnamespace.h:37,
             from /usr/include/i386-linux-gnu/qt5/QtCore/qobjectdefs.h:41,
             from /usr/include/i386-linux-gnu/qt5/QtCore/qobject.h:40,
             from /usr/include/i386-linux-gnu/qt5/QtCore/QObject:1,
             from /home/xxxx/workspace/project/inc/controller.h:5,
             from /home/xxxx/workspace/project/inc/service.h:6,
             from /home/xxxx/workspace/project/src/service.cpp:4:
/usr/include/i386-linux-gnu/qt5/QtCore/qtypetraits.h:523:63: error: template 
argument 1 is invalid
 template<class U> static typename test<!!sizeof(::new U())>::type 
 sfinae(U*);
                                                           ^
 /usr/include/i386-linux-gnu/qt5/QtCore/qtypetraits.h:523:39: error: expected 
 nested-name-specifier
 template<class U> static typename test<!!sizeof(::new U())>::type 
 sfinae(U*);
                                   ^
 /usr/include/i386-linux-gnu/qt5/QtCore/qtypetraits.h:523:71: error: 
 expected initializer before ‘sfinae’
 template<class U> static typename test<!!sizeof(::new U())>::type 
 sfinae(U*);

请帮助我解决此问题。

PS:我使用CMAKE构建:

set (EXECUTABLE projet)

set (BUILD_DIR ${CMAKE_SOURCE_DIR}/build)
set (APPLICATION_DIR ${CMAKE_SOURCE_DIR}/application)
set (CMAKE_LIBRARY_PATH "/usr/local/lib")

include_directories(/usr/local/include)

link_directories(/usr/local/lib)

include_directories(${CMAKE_SOURCE_DIR}/inc)

find_package(Qt5 COMPONENTS Core REQUIRED)

set (CMAKE_INCLUDE_CURRENT_DIR ON)

set (CMAKE_AUTOMOC ON)

set(SOURCES 
    scheduler.cpp
    service.cpp
    controller.cpp
    main.cpp
  )

set(MOC_HEADERS 
    ${CMAKE_SOURCE_DIR}/inc/scheduler.h
    ${CMAKE_SOURCE_DIR}/inc/controller.h
    ${CMAKE_SOURCE_DIR}/inc/service.h
   )

qt5_wrap_cpp(MOC_FILES ${MOC_HEADERS})

add_executable (${EXECUTABLE}
                ${SOURCES}
                ${MOC_FILES})


target_compile_options (${EXECUTABLE} PUBLIC -std=c++11 -Wall)

target_link_libraries(${EXECUTABLE} Qt5::Core)

谢谢。

0 个答案:

没有答案