我有一个带有两个类的头文件'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只是为了减少报告的错误数量。
如何最好地避免此问题?
答案 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会失败。可以同时进行吗?