【问题标题】:Object instantiation error because of namespace [closed]由于命名空间导致的对象实例化错误[关闭]
【发布时间】:2018-01-04 22:43:01
【问题描述】:

所以,我在命名空间中有这个类,但是当我尝试创建一个实例时,我收到以下错误消息:

#ifndef FILE_H
#define FILE_H
#include "constants.h"
#include <cstdlib>
#include <QVector>

namespace Compressor {
class File;
}

class File {
public:
    QVector<QVector<int>> bytes;
    int length;
public:
    File(int l);
};

#endif // FILE_H

...

#include "file.h"

File::File(int l) {
    length = l;

    for(int i = 0; i < length; i++) {
        QVector<int> b;

        for(int j = 0; j < BYTESIZE; j++)
            b.push_back(rand( ) % 2);

        bytes.push_back( b );
    }
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

...

#include "file.h"
#include "tableconfig.h"
#include "tableshow.h"

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    Compressor::File *fl;
//...
//...

...

void MainWindow::on_buttonOrigin_clicked( ) {
    fl = new Compressor::File( ui->spinBox->value( ) ); // The problem happens here.
    showBytesTable(ui->tableOrigin, fl);
}

这里是错误信息:

/home/roger/Programming/C-C++/Linux/Qt/Compressor-4bits/mainwindow.cpp:13:错误:无效使用不完整类型'class Compressor::File' fl = new Compressor::File(ui->spinBox->value()); ^

我该如何解决这个问题?

【问题讨论】:

  • Compressor::FileFile 没有任何关系。而且由于Compressor::File 没有定义(它只是被声明),它是一个不完整的类型。究竟是什么不清楚?
  • @AlgirdasPreidžius 好吧,对于经验较少的人来说可能并不那么明显。也许您的评论可能是这个问题的答案。
  • @Oscar 在这种情况下,我建议有人阅读good C++ book,因为名称空间的主题应该包含在其中。
  • 我尝试做与使用 qtcreator 时自动创建的“mainwindow.h”相同的事情。在此类定义中,我有“命名空间 Ui { class MainWindow; } class MainWindow : public QMainWindow {//...”

标签: c++ qt namespaces


【解决方案1】:

你正在关闭第一行后面的命名空间:

namespace Compressor {
class File;
}

然后您的完整类 File 在命名空间之外定义。这是编译器的另一个File,而不是您在命名空间中启动的那个(它什么都不包含,只是一个前向声明)

【讨论】:

    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2012-01-10
    • 2011-09-10
    • 1970-01-01
    • 2013-11-24
    • 2018-07-24
    相关资源
    最近更新 更多