标识符超出范围

时间:2013-05-01 14:34:27

标签: c# c++ .net command-line-interface

我有几年前制作的这个C ++ / CLI应用程序。它有一个Engine_Base类,有一堆从基础继承的不同类,应用程序的设置用于告诉它应该使用哪个引擎。

我必须在过去几周内重构此应用程序的一部分,现在我得到一些非常奇怪的行为。

在设置所有组件时,代码中有一个位置,逻辑是实例化正确的引擎:

if (this->M_ENGINE == "EngineX") {
    engine_for_app = static_cast<EDI::EDI_Engine_Base^>(
        gcnew EDI::EDI_Engine_EngineX(
            sTemplate, 
            this->m_sDeliveryFilePath, 
            this->M_DBNAME, 
            this->M_DBSERVER, 
            this->M_CUSTOMER_ID, 
            Application::ExecutablePath, 
            this->cBoxDeliveryDateFormat->SelectedIndex, 
            this->M_SO_CREATION,     
            this->M_SO_CREATION_STATUS));
}

引擎类在C#中,它们的构造函数调用基本引擎构造函数:

public EDI_Engine_EngineX(String sDeliveryTemplatePath, String sDeliveryFilePath, String sDbName, String sDbServer, String sCustId, String sAppPath, int iDelDateFormat, String sSOCreation, String sSOCreationStatus)
        : base(sDbName, sDbServer, sCustId, sAppPath, sSOCreation, sSOCreationStatus)
{
    //...Stuff that this particular engine needs to set...
}

这会将执行发送到引擎基类的构造函数:

EDI_Engine_Base::EDI_Engine_Base(String^ sDbName, String^ sDbServer, String^ sCustId, 
    String^ sAppPath, String^ sSOCreation, String^ sSOCreationStatus)
{
    //...yada yada yada setting stuff in the base class...
}

好的...很抱歉花了这么长时间才达到目的,但现在所有的部分都已到位。

我得到的问题是,在执行到基类构造函数之前,所有参数都很好。我的意思是他们被实例化和填充。当我到达基类构造函数时,字符串sDbServer甚至没有实例化。当我尝试快速观察时,我得到了“标识符超出范围”。

考虑到它是一个简单的字符串,它与sDbName同时实例化,使用断点我已验证该值是否传递给实例类,而且基本构造函数的值仍然存在。我根本不明白发生了什么。

所有这些工作一直持续到昨天,但我没有触及此代码。

任何人都有关于发生了什么的想法或理论?

编辑:我找到了答案。

1 个答案:

答案 0 :(得分:0)

参数的名称在重构中已更改,构造函数定义(在.h中)具有此参数的不同名称,这导致运行时错误。

我原以为编译器会抓住这种错误,但我猜他们不是。