Как мне обратиться к пользовательскому интерфейсу QWidgets при работе с пространствами имен?

Я переместил некоторые ранее работающие классы в новое пространство имен, и теперь у меня возникла проблема при доступе к одному классу ui.

Раньше было так:

//header file

namespace Ui
{
  class Setup;
}

class Setup : public QWidget
{
  // stuff
};


Теперь я делаю это так:

//header file

namespace Ui
{
  class Setup;
}

namespace anomalyDetection
{
  class Setup : public QWidget
  {
    // stuff
  };
}


Что меня беспокоит, так это конструктор:

//source file

namespace anomalyDetection
{
  Setup::Setup()
  : ui(new Ui::Setup())  //here i get a C2512 'no default constructor available'
  {

  }
}

Я пробовал несколько созвездий описания типа, но, похоже, это никак не работает. Есть ли способ сделать эту работу?


person LarissaGodzilla    schedule 18.10.2013    source источник
comment
Включили ли вы файл заголовка установки в файл реализации anomalyDetection?   -  person TheDarkKnight    schedule 18.10.2013
comment
@ Merlin069: Я сделал это, да. Боюсь, это проблема пространств имен.   -  person LarissaGodzilla    schedule 18.10.2013
comment
Я в этом не сомневаюсь, просто хотел сначала осветить очевидное.   -  person TheDarkKnight    schedule 18.10.2013
comment
Еще один момент, который я заметил, с которым я сталкивался раньше с конкретным компилятором, который вы вызываете (new Ui::Setup()). Попробуйте удалить скобки для пустого списка параметров, так что (новый Ui::Setup)   -  person TheDarkKnight    schedule 18.10.2013
comment
@ Merlin069: я попробовал оба, но это ничего не изменило. Тем временем я обнаружил проблему, которая вообще не имела ничего общего с пространством имен. Это произошло из-за переименования Setup-класса, которое я сделал до этого.   -  person LarissaGodzilla    schedule 18.10.2013


Ответы (1)


Я думаю, причина в том, что вы объявили два разных класса с именем Setup в двух разных пространствах имен: Ui и anomalyDetection, а первый класс Ui::Setup не имеет конструктора по умолчанию, и компилятор это обнаруживает. Вам нужно определить класс Ui::Setup следующим образом:

namespace Ui
{
    class Setup
    {
    public:
        Setup()
        {}
    };
}

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

person vahancho    schedule 18.10.2013
comment
Хорошо... вроде работает, но теперь мне придется обращаться к классу как к Ui::anomalyDetection::Setup. Есть ли способ обойти это? Что касается того, почему класс разработан таким образом, это хороший вопрос. Я работаю с относительно старой кодовой базой, поэтому позже мне нужно будет проверить, есть ли лучший способ. На данный момент мне просто нужно заставить его работать, желательно без необходимости обращаться к нему с помощью Ui::anomalyDetection::Setup. - person LarissaGodzilla; 18.10.2013
comment
@bumbumfish, с текущим дизайном класса Ui::anomalyDetection::Setup нет. Если вы хотите иметь такой класс, вам нужно определить его во вложенных пространствах имен. - person vahancho; 18.10.2013
comment
Вы можете ввести более короткую версию вместо того, чтобы постоянно вводить Ui::anomolyDetection::Setup. - person TheDarkKnight; 18.10.2013
comment
@vahancho: хорошо, я неправильно истолковал ваш бит кода. Теперь я понял, это имеет смысл. Но он работал до того, как я добавил пространства имен, так почему тогда ему не понадобился конструктор по умолчанию? - person LarissaGodzilla; 18.10.2013
comment
@bumbumfish, я не могу этого сказать, потому что не вижу старого кода и того, как там использовалось Ui::Setup. - person vahancho; 18.10.2013
comment
@vahancho: первый кодовый блок в моем первоначальном вопросе — это старый заголовок, с которым он работал. Третий кодовый блок — это то, как он использовался и до сих пор используется. Все, что я изменил, — это пространство имен вокруг объявления класса. Итак, мне интересно, почему сейчас вдруг возникла необходимость в конструкторе по умолчанию? - person LarissaGodzilla; 18.10.2013
comment
@bumbumfish: я получаю ту же ошибку, если использую Ui::Setup() независимо от существования пространства имен anomalyDetection. - person vahancho; 18.10.2013
comment
@vahancho: Это странно. Я только что проверил это на новом проекте, и вы правы. Интересно, может быть, я тоже по незнанию изменил что-то еще... Мне придется разобраться с этим. - person LarissaGodzilla; 18.10.2013
comment
Я проверил некоторые другие вещи, и оказалось, что это не имеет ничего общего с пространством имен. Это была остаточная ошибка от переименования, которое я сделал до этого. В любом случае спасибо и извините за потраченное время. - person LarissaGodzilla; 18.10.2013