在同一Name.h文件中使用Name :: Class2中的Name :: Class1失败

时间:2011-02-26 12:19:12

标签: .net visual-studio-2010 dll c++-cli windows-forms-designer

我有一个带有两个类的头文件'Custom.h',ResizeLabel和ResizePanel,用于构建包含自定义控件的dll。如果我在ResizeLabel中使用Custom :: ResizePanel则失败:

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

错误列表中还有一个警告:

Exception of type 'System.Exception' was thrown

我想这个警告是相关的。可能是因为Visual Studio正在尝试从包含它的代码中加载包含Custom :: ResizePanel的dll吗?

代码如下:

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 个答案:

答案 0 :(得分:2)

这是经典的C ++行为。在没有首先学习标准C ++基础知识的情况下尝试学习C ++ / CLI将非常困难。

使这项工作的一般模式是:

  • 转发声明类型
  • 定义类型
  • 定义类型成员函数
按顺序

例如:

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;
}

答案 1 :(得分:0)

编译错误是因为尚未在命名空间中看到ResizePanel。编译器没有意识到您将在以后添加它。也许你可以改变订单?

另一个错误可能是因为如果ResizeLabel对象不是ResizePanel,则dynamic_cast会失败。可以同时进行吗?