Задать вопрос

Почему не видно определение класса?

Здравствуйте. Я новичок в C++. Программирую в VisualStudio2008 Возникла проблема при подключении заголовочных файлов. У меня есть файл MyClasses.h:
#ifndef MYCLASSES_H
#define MYCLASSES_H
namespace my {
    // Some template classes
    ...
    MyClass {declaration} // My class (not template) contains static methods only
   // Other classes declaration
};
#endif

Соответственно есть файл MyClasses.cpp:
namespace my {
    // implementation of MyClass and other classes
}

MyClass состоит из нескольких статических методов и всё (без переменных). Заголовочный файл уже используется как минимум один раз в другом проекте (но в том же решении). Теперь возникла необходимость подключить его в тот же проект, в котором он (MyClasses.h) определён. Но при подключении я не могу использовать ни MyClass::method() ни my::MyClass::method() (error C2653: 'MyClass' : is not a class or namespace name + error C3861: 'method': identifier not found). Пробовал объявлять (просто объявлять) MyClass в том файле, куда хочу его подключить:
#include "MyClasses.h"
class MyClass;

но компилятор не видит реализацию класса (error C2027: use of undefined type 'MyClass').
Подскажите пожалуйста мне непутёвому, как правильно подключить MyClasses.h? Заранее спасибо

UPD: Если я просто делаю #include "MyClasses.h", то получаю
error C2653: 'MyClass' : is not a class or namespace name
на строчке
MyClass::StaticMethod(); // или так my::MyClass::StaticMethod();

Если я использую предварительное объявление класса так
#include "MyClasses.h";
class MyClass;
или так
#include "MyClasses.h";
namespace my { class MyClass; }
то получаю ошибку error C2027: use of undefined type 'my::MyClass' на строчке my::MyClass::StaticMethod();
  • Вопрос задан
  • 3698 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@Sumor
Посмотрите используете ли вы предварительно скомпилированные заголовки (Precompiled headers).
Если да, то есть ли в каждом .cpp первой строчкой запись
#include "stdafx.h"

Хорошая статья на Хабре
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Какую ошибку компилятор репортит самой первой? И хорошо бы показать как вы определяете класс MyClass, есть подозрение, что у вас там просто ошибка.

И еще, это не особо относится к делу, но похоже, тут у вас ошибка:
#ifndef MYSECLASSES_H
#define MYCLASSES_H


такие гарды не защищают от повторного включения - стоит это поправить.

UPD: вы показываете определение класса MyClass:
MyClass {declaration} // My class (not template) contains static methods only

(хотя ваше сокращение какое-то странное), а используете класс MyClasses:
MyClasses::StaticMethod(); // или так my::MyClasses::StaticMethod();

вы уж определитесь что вам нужно, MyClass или MyClasses?
Ответ написан
EvgenijDv
@EvgenijDv
C/C++ programmer
Как уже написали выше, покажите ваш файл с объявлением класса и желательно полный список ошибок компиляции связанных с этим классом.
Ответ написан
Комментировать
@xandox
странная конструкция, что ты ей хотел сказать?
#include "MyClasses.h"
class MyClass;


если нужен forward declaration, то делай так
namespace my { class MyClass; }

если нужна переменная, то
my::MyClass myClass;

к UPD
Слушай, у тебя какой-то полный бардак
Ты во-первых определись как называется твой класс MyClass или MyClasses. По тому что у тебя в коде написано одно, а в ошибке совершенное другое.
Во-вторых точка с запятой после инклуда тебе зачем?
И да покажи уже свой заголовчник и место где ты его пытаешься использовать. И еще - у тебя дополнительно нет ошибки, что не получилось найти MyClasses.h ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы