سؤال

هذه رسالة خطأ محبطة للغاية في Qt Creator: ’XYZ’ does not name a type.هذا يعني عادة أن هناك خطأ في الفصل XYZ يمنع المترجم من إنشاء النوع، ولكن لا توجد تلميحات إضافية حول الخطأ الذي حدث.

أي اقتراحات؟

هل كانت مفيدة؟

المحلول

ولقد وجدت هذه المشكلة على qtcreator 3.4.1 وQT 5.4، عندما يحل محل مثل

#include <QTextEdit>

مع

class QTextEdit;

وهذه المشكلة ذهب.

نصائح أخرى

أنا فقط كان لي هذه المشكلة، وما شابه أركاروف لقد قال :المشكلة هي أننا عندما نقوم بتضمين ملف رأس في ملف كود المصدر، ونستخدم فيه التوجيه #ifndef، لا يمكننا تضمينه مرة أخرى في ملف رأس لإعطاء نوع من فئته المضمنة لمتغير في المصدر ملف التعليمات البرمجية

مثال :

class1.h يحتوي على الفئة 1 class2.h يحتوي على الفئة 2 class2 لها متغير خاص V مع نوع class1 إذا قمنا بتضمين class1.h في class2.تكلفة المكالمة الهاتفية لا يمكننا تضمينه في class2.h لإعطاء V نوع class1.

لذلك وضعنا في class2 .cpp class2.h قبل class1.h أو نحذف class1.h من class2.cpp

في abc.cpp الخاص بك تأكد من أن تشمل xyz.h قبل بما في ذلك abc.h.

ولا فكرة لماذا مبادلة اثنين من جميع أنحاء شأنها أن تحدث فرقا مهما فعلت بالنسبة لي.

هل تحصل على خطأ من المترجم أو IDE (كما تسطير متعرج)؟ لقد واجهت هذه في كيو تي الخالق 1.2.9 واعتقد انها خطأ في IDE.

وأعتقد أن نعلن شيئا من نوع XYZ مثل

XYZ foo;

لا يعرف المشكلة هي XYZ حتى الان.

وفيما يلي هو مشكلتي واستنتاجي. ما رأيك؟

ومشكلتي هي عندي ABC الطبقة وطبقة XYZ. الطبقة ABC يحتوي عضو أن يعلن كنوع XYZ. الطبقة XYZ يحتوي عضو أن يتم التصريح عن نوع ABC. المترجم لا يعرف ما هو نوع XYZ ولكن لأنها لم تعرف بعد. لذلك الخطأ معين هو "XYZ" لا سبيل المثال لا النوع.

ورمز مثال:

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

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

وفي مشروع كيو تي في الآونة الأخيرة، حيث كنت قد مجرد تركيب أحدث QT (3/2011)، والشفاء من ثلاثة من هؤلاء الذي وقف بلدي بناء بإضافة هذا ...

#include <sys/types.h>

... قبل التضمين من ملف الرأس الذي رمي الأخطاء. أن فعل ذلك.

وأنا لا أعرف لماذا ستوزع شيء كان مثل هذه المشاكل، وربما في غيرها من النظم types.h يتم تضمين مع شيء آخر، ولكن ليس في حالتي، على أي حال. على أمل أن يساعد شخص ما.

هل # include'ing مساعدة ملف الرأس المقابلة؟

إذا كنت تستخدم القوالب، ثم عليك أن تسبق اسم الفئة مع "typename" حتى يتسنى للمترجم أن تعترف بأنها نوع ...

template <typename t> //...

وتحدث احتمالان لي:
1. ربما لديك فتحة بدلا من SIGNAL في مكالمة connect (). 2. في بعض الأحيان أنه يساعد على جعل تحرير مبرر لملف .PRO (مثل إدراج وحذف مسافة)، بحيث يحصل تشغيل كماكي والحصول على إنشاء ملفات .moc.

في حالتي كنت لا تستخدم مساحة الاسم تم تعريف فئة في. وقد وردت محتويات رأس داخل مساحة اسم، ولكن ملف مصدر كان في عداد المفقودين التوجيه using namespace.

و.h:

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

و.cpp:

using namespace mynamespace

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

ولقد وجدت حلا لنفسي. يقول لدي فئة A و B. الطبقة "A.h" يشمل "B.h" ولها مثيل B عضوا. "B.h" يشمل "A.h" ولها مثيل A عضوا. مترجم يعطيني خطأ في "B.h" على سطر من التعليمات البرمجية حيث أعلن عضو في الدرجة A:

"A doesn't name type"

ما أقوم به هو في "A.h" يمكنني إزالة # تتضمن "B.h" ومكان # تشمل "B.h" إلى "A.cpp". وقبل إعلان الدرجة أنا أكتب الدرجة B؛

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

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

وعملت بالنسبة لي، حظا سعيدا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top