2009-09-14 35 views
8

Đây là thông báo lỗi rất bực bội trong Qt Creator: ’XYZ’ does not name a type. Điều này thường có nghĩa là có lỗi trong lớp XYZ để ngăn trình biên dịch tạo kiểu, nhưng không có gợi ý bổ sung nào về những gì đã xảy ra.Qt Creator: “XYZ không đặt tên một loại”

Mọi đề xuất?

+0

Bạn có thể hiển thị cho chúng tôi dòng gây ra lỗi không? –

+1

Trông giống như một lỗi trong Trình tạo Qt. Nó vẫn ở đó trong 2,01. Chương trình của tôi biên dịch và chạy tốt, nhưng tôi nhận được một loạt các thông điệp cảnh báo từ các loại dường như ngẫu nhiên. Ngay cả một số loại Qt (như QScriptValue). – Imbrondir

Trả lời

2

tôi thấy vấn đề này trên QtCreator 3.4.1 và QT 5.4, khi tôi thay thế như vậy như

#include <QTextEdit> 

với

class QTextEdit; 

vấn đề này đi.

0

# include có hỗ trợ tệp tiêu đề tương ứng không?

+0

Không, tôi chắc chắn rằng tôi đã đưa nó vào. –

+0

Bạn có thể vui lòng đăng một ví dụ đầy đủ được khép kín để chúng tôi thực sự có thể xem xét điều gì đó không? Có thể đánh bại đoán :) –

+0

Tôi không biết phải tìm gì ... điều này đang xảy ra trong một dự án với 100 tệp. –

0

Nếu bạn đang sử dụng các mẫu, sau đó bạn cần phải đặt trước tên lớp với "typename" để trình biên dịch có thể nhận ra đó là một loại ...

template <typename t> //... 
+0

Cảm ơn nhưng không sử dụng mẫu ... –

2

Bạn nhận được lỗi từ trình biên dịch hoặc IDE (như một gạch dưới nguệch ngoạc)? Tôi đã gặp phải điều này trong Qt Creator 1.2.9 và tôi nghĩ rằng đó là một lỗi trong IDE.

2

Tôi tin rằng bạn đang khai báo một cái gì đó kiểu XYZ như

XYZ foo; 

Vấn đề là XYZ chưa được xác định.

Sau đây là vấn đề của tôi và kết luận của tôi. Bạn nghĩ sao?

Vấn đề của tôi là tôi có lớp ABC và lớp XYZ. Lớp ABC có một thành viên được khai báo là kiểu XYZ. Lớp XYZ có một thành viên được khai báo là kiểu ABC. Trình biên dịch không biết loại XYZ là gì bởi vì nó chưa được xác định. Do đó lỗi được đưa ra là 'XYZ' không đặt tên cho một loại.

Ví dụ Code:

class ABC{ 
private: 
    XYZ *xyz; //XYZ is not defined yet 
}; 

class XYZ{ 
private: 
    ABC *abc; //ABC is defined above 
}; 
3

Trong abc.cpp của bạn chắc chắn rằng bạn bao gồm xyz.h trước bao gồm abc.h.

Không có ý tưởng tại sao trao đổi hai xung quanh sẽ tạo sự khác biệt tuy nhiên nó đã làm cho tôi.

0

Hai khả năng xảy ra với tôi:
1. Có lẽ bạn có SLOT thay vì SIGNAL trong lệnh gọi connect(). 2. Đôi khi nó giúp thực hiện chỉnh sửa vô cớ đối với tệp .PRO (ví dụ: chèn và xóa dấu cách), để QMake chạy và tệp .moc được tạo.

1

trong một dự án QT gần đây, nơi tôi vừa cài đặt QT gần đây nhất (3/2011), tôi chữa khỏi ba trong số này đã được dừng xây dựng của tôi bằng cách thêm này ...

#include <sys/types.h> 

. ..prior để bao gồm các tập tin tiêu đề đã được ném các lỗi. Điều đó đã làm điều đó.

Tôi không biết tại sao họ sẽ phân phối thứ gì đó có vấn đề như vậy, có lẽ trong các loại hệ thống khác.h được bao gồm trong thứ khác, nhưng không phải trong trường hợp của tôi. Hy vọng rằng sẽ giúp một ai đó.

5

tôi chỉ có vấn đề này, và như Arckaroph đã nói: vấn đề là khi chúng tôi bao gồm một tập tin header trong một file mã nguồn, và chúng tôi sử dụng trong đó cáC#ifndef chỉ thị, chúng tôi không thể bao gồm nó một lần nữa trong một tập tin tiêu đề để cung cấp cho một loại nó bao gồm lớp cho một biến trong tập tin mã nguồn

dụ:

class1.h chứa Class1 class2.h chứa Class2 class2 có một biến V riêng với class1 loại nếu chúng ta bao gồm class1.h trong class2. CPP chúng tôi không thể đưa nó vào lớp2.h để cung cấp cho loại V loại 1.

vì vậy chúng tôi đưa vào class2.cpp class2.h trước class1.h hoặc chúng ta xóa class1.h từ class2.cpp

0

Trong trường hợp của tôi, tôi đã không sử dụng không gian tên lớp đã được xác định. Nội dung của tiêu đề được chứa trong không gian tên, nhưng tệp nguồn bị thiếu chỉ thị using namespace.

.h:

namespace mynamespace { 
    class MyClass : public QWidget 
    { 
     ... 
    } 
} 

.cpp:

using namespace mynamespace 

MyClass::MyClass(QWidget *parent) : QWidget(parent) 
{ 
} 
0

Tôi tìm thấy một giải pháp cho bản thân mình. Giả sử tôi có lớp A và lớp B. "A.h" bao gồm "B.h" và có trường hợp B là thành viên. "B.h" bao gồm "A.h" và có phiên bản A làm thành viên. Compiler mang lại cho tôi một lỗi trong "Bh" trên dòng mã mà thành viên của lớp A được công bố:

"A doesn't name type" 

Những gì tôi làm là trong "Ah" Tôi loại bỏ #include "Bh" và địa điểm #include "Bh "đến" A.cpp ". Và trước khi tuyên bố lớp A tôi viết lớp B;

... 
// #include "B.h" 
class B; 

class A 
{ 
... 
B m_b; 
}; 
... 

Làm việc cho tôi, Chúc bạn may mắn!

Các vấn đề liên quan