На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> VS2022 Думает что конструктор это метод и он не определен , Непонятное поведение VS2022
    Здравствуйте.

    Свалился на меня большой проект на C++ и вот столкнулся со странным поведение VS. Не понятно что ей надо.

    Есть хедер: ExtendedInquiry.h

    ExpandedWrap disabled
      #pragma once
      #pragma managed
       
      #include "stdafx.h"
      #include "InternalStructures.h"
      #include <InquiryReader.h>
       
      using namespace System;
      using namespace System::Text;
      using namespace System::Collections::Generic;
      using namespace P::M::Common;
       
      ///////////////////////////////////////////////////////
      Namespace_InternalManager_Start
      ///////////////////////////////////////////////////////
       
       
          [Serializable]
          public ref class ExtendedInquiry
          {
          public:
              ExtendedInquiry(eDevType devType);
       
              void SetData(const I_ExtendedInquiryResponseBody* pInq);
       
              virtual String^ ToString() override;
              emApiStatusCode status;
       
          private:
              String^ GetHeaderStr();
              String^ GetBodyStr();
       
      <== кусь ==>
       
              void GetHWCardInfo(StringBuilder^ body, sHWCardInfo^ hi);
       
          private:
              eDevType deviceType;
       
      <== кусь ==>
       
              sTestStatus^ mmWaveCalibrationStatus;
          };
       
      ///////////////////////////////////////////////////////
      Namespace_InternalManager_End
      ///////////////////////////////////////////////////////


    Два макроса пределены так:

    ExpandedWrap disabled
      #define     Namespace_InternalManager_Start     namespace P \
                                                              { namespace M \
                                                              { namespace InternalManager {
      #define     Namespace_InternalManager_End       }}}


    Ну и соответсвующий cpp: ExtendedInquiry.cpp

    ExpandedWrap disabled
      #include "StdAfx.h"
      #include "ExtendedInquiry.h"
      #include <rtxsrc\rtxContext.h>
      #include <ApiCommon\RtxUtil.h>
       
      using namespace SGApiCommon;
      using namespace System::Text;
       
      // The text in here does not need to be translated
       
      ///////////////////////////////////////////////////////
      Namespace_InternalManager_Start
      ///////////////////////////////////////////////////////
       
      ExtendedInquiry::ExtendedInquiry(eDevType devType) : deviceType(devType)
      {
          status = emApiStatusCode::eSuccess;
          esn = gcnew cli::array<Byte>(8);
          testDate = gcnew DateTime();
       
      <== кусь ==>
       
      }


    Т.е. как бы все с виду нормально. Оба файла добавлены в проект, проект компилируется и работает.

    Но, VS почему-то подчеркивает конструктор в хедере и говорит что метод не определен. Хотя это конструктор и он явно определен.

    VCR001: Function definition for 'ExtendedInquiry' not found.
    Прикреплённая картинка


    Полный ребилд и перезагрузку и прочие пинки по калесам пробовал.

    Если просто продублировать конструктор, даже есили он пустой.

    ExpandedWrap disabled
      #include "StdAfx.h"
      #include "ExtendedInquiry.h"
      #include <rtxsrc\rtxContext.h>
      #include <ApiCommon\RtxUtil.h>
       
      using namespace SGApiCommon;
      using namespace System::Text;
       
      // The text in here does not need to be translated
       
      ///////////////////////////////////////////////////////
      Namespace_InternalManager_Start
      ///////////////////////////////////////////////////////
       
      ExtendedInquiry::ExtendedInquiry(eDevType devType) : deviceType(devType)
      {
          status = emApiStatusCode::eSuccess;
          esn = gcnew cli::array<Byte>(8);
          testDate = gcnew DateTime();
       
      <== кусь ==>
       
      }
       
      ExtendedInquiry::ExtendedInquiry(eDevType devType) : deviceType(devType)
      {
       
      }


    Подчеркивание пропадает. Если старый удалить и оставить только новый, то студия опять говорит что метод не опеределен.

    Может кто знает почему так и как исправить?

    Заранее спасибо.
      Попробуйте для начала просто почистить файлы intellisense. Поскольку это его сообщения. Папочку .vs
      Ну или отключить это предупреждение. Все таки компилятор в приоритете. Может это какой то косяк самого intellisense
      Сообщение отредактировано: sharky72 -
        Цитата sharky72 @



        методом деления проблемы пополам - попробуй для начала сделать минимальный законченный проект который повторял бы ошибку.
        далее можно уже будет смотреть.
        в истории мелкомягких были времена когда и студия лагала - мама не балуйся. некоторые ошибки они так и потянули дальше, некоторые спешно фиксили в следующих версиях.
        так например было с первым дотнетом в 2001, под си бимоль - именно я тогда вычислил их не желание компилять проекты в солюшене более 65535 байт для таргет файлов.
        ржали даже кони от этой сыррятины...

        ЗЫ
        вспомнилось
          Цитата sharky72 @
          Попробуйте для начала просто почистить файлы intellisense. Поскольку это его сообщения. Папочку .vs
          Ну или отключить это предупреждение. Все таки компилятор в приоритете. Может это какой то косяк самого intellisense

          Попробовал. Ниче не поменялось.

          Цитата kolobok0 @
          методом деления проблемы пополам - попробуй для начала сделать минимальный законченный проект который повторял бы ошибку.
          далее можно уже будет смотреть.

          Дык оно так то все правильно показывает. Это просто в нескольких парах (ну я про h + cpp) так делает. А так по всему проекто все хорошо.

          Я поэтому и подумал. может все-таки доло в конкретном исходнике...
          Сообщение отредактировано: Felan -
            Сомневаюсь. Если добавлять второй конструктор - оно не откомпилится я правильно понимаю? Значит это проблема intellisense. Попробуй отключить эту проверку. Или не обращай внимания.
              Не, я так не делаю, и другим не разрешаю, если могу :). Проверки не просто так придуманы. Что бы их отключать нужна серьезная причина.

              Понятно что проблема с интеллисенсе. Проект же копилится и работает. Но вот большая с большей частью кода нормально все, но вот в некоторых местах че-то не так.

              Хотелось бы не под ковер замести, а именно понять че не нравится. А уж по итогам смотреть, исправить, что более вероятно, или действительно отключить...

              Ладно. Посмотрим. Когда нибудь выяснится :)
                Это же Managed С++/CLI судя по синтаксису?
                Может ему просто нужно явно определить дефолтный конструктор?
                ExpandedWrap disabled
                  ExtendedInquiry(){}
                Сообщение отредактировано: sharky72 -
                  Ну как бы да. С одной стороны если добавить какой-либо конструктор, как я и писал, то варниниг проподает...

                  Но, во первых есть другие классы у которых объявлен только дефолтный конструктор и у них такая же фигня. А во вторых у этого класса по дизайну не предпологается дефолтный конструктор.

                  Я тут заметил, что похоже это происходит для всех классов в проекте.
                  Тут довольно большой солюшен, Часть проектов C++ часть С# этот как раз "стыкует" анменеджед цпп и сишарп. И у каждого класса тут этот варнинг...

                  Я пересоздавал солюшен в ручную и тупо перетаскивал код... Может быть не угадал с типом проекта... или забыл\неправильно добавил какой-нибудь рефернс...
                    Насчет не предполагается - я этого не вижу. Его и так компилятор создаст. Поскольку явно не запрещено его иметь.
                    Я последний раз сталкивался с Managed c++ лет 5 назад. Но тогда интеллисенс был менее придирчив.
                    Гугль то что-то говорит внятное по поводу этого предупреждения?
                    Сообщение отредактировано: sharky72 -
                      Цитата sharky72 @
                      Его и так компилятор создаст. Поскольку явно не запрещено его иметь.

                      Не создаст. Там же есть конструктор с параметрами.
                        Да. Не создаст.
                        Ну тогда не знаю чем помочь. Я в Managed c++ не очень. Поскольку это не предупреждение компилятора, а интеллисенса - наверное придется игнорировать.
                        Сообщение отредактировано: sharky72 -
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0333 ]   [ 16 queries used ]   [ Generated: 28.03.26, 11:16 GMT ]