2010-04-27 4 views
0

У меня ошибка компиляции, которую я не понимаю. У меня есть комбинация файлов h/cpp, которая не содержит класс, но определяет некоторые служебные функции. когда я пытаюсь использовать структуру, которая определена в другом классе я получаю ошибку:C++ ошибка компиляции

ошибка C2027: использование неопределенного типа «B :: C»

так, усеченную к проблеме, Н- файл выглядит следующим образом

namespace A { 
    void foo(B::C::SStruct const & Var); 
} 

определение SStruct находится в классе, который находится в другой ч-файл, который, конечно, включен.

namespace B { 
    class C { 
     public: 
     struct SStruct { }; 
    }; 
} 

странная вещь, я могу использовать эту структуру в других классах хорошо, это только кажется, что связано с этим один час-файл, который содержит только вспомогательные функции. Что мне здесь не хватает? спасибо!

ответ

5

После коррекции недостающих точек с запятой и т.д. это составляет:

namespace B { 
    class C { 
     public: 
     struct SStruct { }; 
    }; 
} 
namespace A { 
    void foo(B::C::SStruct const & Var); 
} 

Очевидно, что если порядок двух пространств имен были переключены, это не будет работать. Возможно, вы используете # заголовки в неправильном порядке. Если это ошибка, это плохой дизайн - вы не должны допускать, чтобы порядок заголовков имел значение в вашем коде.

+0

спасибо. извините, я забыл упомянуть об этом в своем оригинальном посте, он является публичным. – clamp

+0

yep, похоже, что это заказ. благодаря! мне нужно будет пересмотреть организацию моих h-файлов. – clamp

0

Я предполагаю, что вы имели в виду «класс C», а не «класс C».

struct SStruct является закрытым для класса C (частное - это видимость членов класса по умолчанию).

Как таковой, он не виден вне класса C и его друзей, который не включает A :: foo().

+0

спасибо. извините, я забыл упомянуть об этом в своем оригинальном посте, он является публичным. – clamp

0
Class C { 
     struct SStruct { }; 
    } 

==>

class C { 
public: 
     struct SStruct { }; 
    }; 
+0

спасибо. извините, я забыл упомянуть об этом в своем оригинальном посте, он является публичным. – clamp

0

Ваш класс отсутствует точка с запятой после определения. Это должно быть:

namespace B { 
    class C { 
     public: 
     struct SStruct { }; 
    }; // <=== Here 
} 
+0

да спасибо, но это не проблема – clamp