Как избежать неоднозначного имени базового класса с тем же именем определения регистра от производителя - PullRequest
0 голосов
/ 23 января 2019

Я получаю базовый класс с именем ( Class Adc ).Существует также заголовочный файл производителя, который имеет struct для регистров АЦП с именем Adc .

Когда я пытаюсь использовать структуру ADC в моем дочернем классе, компилятор смешивает его с базовым классом.Кроме того, базовый класс является частью пространства имен «symm», в то время как структура является частью глобального пространства имен.

Есть ли способ избежать двусмысленности в именах, не меняя оба имени.Базовый класс используется во многих проектах.Изменение имени базового класса может создать проблемы в других проектах.Я не хочу трогать заголовок производителя тоже.

Это структура от производителя, о которой я говорю:

 /** \brief ADC hardware registers */
#if !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__))
typedef struct {
  __IO ADC_CTRLA_Type            CTRLA;       /**< \brief Offset: 0x00 (R/W  8) Control A */
  __IO ADC_CTRLB_Type            CTRLB;       /**< \brief Offset: 0x01 (R/W  8) Control B */
  __IO ADC_REFCTRL_Type          REFCTRL;     /**< \brief Offset: 0x02 (R/W  8) Reference Control */
  __IO ADC_EVCTRL_Type           EVCTRL;      /**< \brief Offset: 0x03 (R/W  8) Event Control */
  __IO ADC_INTENCLR_Type         INTENCLR;    /**< \brief Offset: 0x04 (R/W  8) Interrupt Enable Clear */
  __IO ADC_INTENSET_Type         INTENSET;    /**< \brief Offset: 0x05 (R/W  8) Interrupt Enable Set */
  __IO ADC_INTFLAG_Type          INTFLAG;     /**< \brief Offset: 0x06 (R/W  8) Interrupt Flag Status and Clear */
  __I  ADC_SEQSTATUS_Type        SEQSTATUS;   /**< \brief Offset: 0x07 (R/   8) Sequence Status */
  __IO ADC_INPUTCTRL_Type        INPUTCTRL;   /**< \brief Offset: 0x08 (R/W 16) Input Control */
  __IO ADC_CTRLC_Type            CTRLC;       /**< \brief Offset: 0x0A (R/W 16) Control C */
  __IO ADC_AVGCTRL_Type          AVGCTRL;     /**< \brief Offset: 0x0C (R/W  8) Average Control */
  __IO ADC_SAMPCTRL_Type         SAMPCTRL;    /**< \brief Offset: 0x0D (R/W  8) Sample Time Control */
  __IO ADC_WINLT_Type            WINLT;       /**< \brief Offset: 0x0E (R/W 16) Window Monitor Lower Threshold */
  __IO ADC_WINUT_Type            WINUT;       /**< \brief Offset: 0x10 (R/W 16) Window Monitor Upper Threshold */
  __IO ADC_GAINCORR_Type         GAINCORR;    /**< \brief Offset: 0x12 (R/W 16) Gain Correction */
  __IO ADC_OFFSETCORR_Type       OFFSETCORR;  /**< \brief Offset: 0x14 (R/W 16) Offset Correction */
       RoReg8                    Reserved1[0x2];
  __IO ADC_SWTRIG_Type           SWTRIG;      /**< \brief Offset: 0x18 (R/W  8) Software Trigger */
       RoReg8                    Reserved2[0x3];
  __IO ADC_DBGCTRL_Type          DBGCTRL;     /**< \brief Offset: 0x1C (R/W  8) Debug Control */
       RoReg8                    Reserved3[0x3];
  __I  ADC_SYNCBUSY_Type         SYNCBUSY;    /**< \brief Offset: 0x20 (R/  16) Synchronization Busy */
       RoReg8                    Reserved4[0x2];
  __I  ADC_RESULT_Type           RESULT;      /**< \brief Offset: 0x24 (R/  16) Result */
       RoReg8                    Reserved5[0x2];
  __IO ADC_SEQCTRL_Type          SEQCTRL;     /**< \brief Offset: 0x28 (R/W 32) Sequence Control */
  __IO ADC_CALIB_Type            CALIB;       /**< \brief Offset: 0x2C (R/W 16) Calibration */
} Adc;
#endif /* !(defined(__ASSEMBLY__) || defined(__IAR_SYSTEMS_ASM__)) */

Это определение моего дочернего класса:

class ADC_SAML21 : public Adc
    {
        public:

            ADC_SAML21(bool interruptable = false);
}

Спасибо.

С уважением, Rishit

1 Ответ

0 голосов
/ 24 января 2019

В местах, где компилятор не может определить, на какой Adc вы ссылаетесь, вы можете использовать оператор области действия, чтобы указать, какой именно. Используйте symm::Adc для базового класса (или, возможно, ::symm::Adc) и ::Adc для глобальной структуры.

...