Использование Name :: Class1 из Name :: Class2 в том же файле Name.h не удается - PullRequest
1 голос
/ 26 февраля 2011

У меня есть заголовочный файл 'Custom.h' с двумя классами, ResizeLabel и ResizePanel, используемые для создания библиотеки DLL, содержащей пользовательские элементы управления. Если я использую Custom :: ResizePanel в ResizeLabel, то происходит сбой:

error C2039: 'ResizePanel' : is not a member of 'Custom'

В списке ошибок также есть предупреждение:

Exception of type 'System.Exception' was thrown

Я полагаю, что предупреждение имеет отношение Может ли это быть из-за того, что Visual Studio пытается загрузить dll, которая содержит Custom :: ResizePanel, из кода, который она компилирует, который ее содержит?

Код выглядит следующим образом:

namespace Custom {

public ref class ResizeLabel : public System::Windows::Forms::Label
{
protected: virtual void OnTextChanged(System::EventArgs^  e) override {
            __super::OnTextChanged(e);
            // Not elegant I know, 
            // but this is just to force the panel to process the size change
            dynamic_cast<Custom::ResizePanel^>(this->Parent)->CurrentWidth = 0;
        }
    ...
    };
public ref class ResizePanel : public System::Windows::Forms::Panel
{ ... };
}

Я сделал это dynamic_cast, чтобы уменьшить количество сообщений об ошибках.

Как мне лучше избежать этой проблемы?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Это классическое поведение C ++.Попытка выучить C ++ / CLI без первоначального изучения основ стандарта C ++ будет очень трудной.

Общая схема выполнения этой работы:

  • Формула предварительного объявления типов
  • Определить типы
  • Определить функции-члены типа

в указанном порядке.

Например:

ref class ResizeLabel;
ref class ResizePanel;

public ref class ResizeLabel : public System::Windows::Forms::Label
{
protected:
    virtual void OnTextChanged(System::EventArgs^  e) override;
    ...
};

public ref class ResizePanel : public System::Windows::Forms::Panel
{
    ...
};

void ResizeLabel::OnTextChanged(System::EventArgs^  e)
{
    __super::OnTextChanged(e);
    // Not elegant I know, 
    // but this is just to force the panel to process the size change
    dynamic_cast<Custom::ResizePanel^>(this->Parent)->CurrentWidth = 0;
}
0 голосов
/ 26 февраля 2011

Ошибка компиляции из-за того, что ResizePanel еще не виден в пространстве имен.Компилятор не понимает, что вы добавите его позже.Возможно, вы можете изменить порядок?

Другая ошибка может быть из-за сбоя dynamic_cast, если объект ResizeLabel также не является ResizePanel.Может ли это быть одновременно в обоих случаях?

...