2 класса с одинаковыми именами в пространствах имен - PullRequest
0 голосов
/ 26 сентября 2018

Я вернулся к изучению C ++, проводя некоторые старые университетские курсы, и сейчас я изучаю параметрический полиморфизм, а также создаю свои собственные пространства имен.В упражнении говорится, что я должен создать пространство имен с именем «Федерация», в котором есть класс «Корабль», который принимает значения, и одно значение по умолчанию, которое никогда не изменяется.внутри пространства имен федерации также есть пространство имен «Звездный флот», в котором у нас также есть класс «Корабль», единственное отличие состоит в том, что указанное по умолчанию значение может быть указано пользователем.

Вот код:

Federation.hpp

#include <iostream>
#include <string>
#include <cstring>

namespace Federation
{
  namespace Starfleet 
  {
    class Ship
    {
    public:
      Ship(int length, int width, std::string name, short maxWarp);
      ~Ship();
    private:
      int _length;
      int _width;
      std::string _name;
      short _maxWarp;
    };
  };
  class Ship
  {
  public:
    Ship(int length, int width, std::string name);
    ~Ship();
  private:
    int _length;
    int _width;
    std::string _name;
  }
};

Federation.cpp

#include "Federation.hpp"
using namespac std;

Federation::Starfleet::Ship::Ship(int length, int width, string name, short maxWarp): _length(length), _width(width), _name(name), _maxWarp(maxWarp)
{
  cout << "Starfleet Ship Created." << endl;
}

Federation::Starfleet::Ship::~Ship()
{

}

Federation::Ship::Ship(int length, int width, string name, int speed = 1): _length(length), _width(width), _name(name)
{
  cout << "Regular Ship Created"
}

Federation::Ship::~Ship()
{

}

main.cpp

#include "Federation.hpp"

int main(int ac, char **av)
{
  Federation::Starfleet::Ship mainShip(10, 10, "Starfleet Ship", 20);
  Federation::Ship smallShip(5, 5, "Small Ship");
}

При компиляции я получаю эту ошибку: "прототип для Federation :: Ship :: Ship (int, int, std :: __ cxx11:: string, int) не соответствует ни одному классу в Federation :: Ship "

Я совершенно не понимаю, что это значит, когда я смотрю на свои функции в моем файле hpp, все они кажутсячтобы быть точным, поэтому я не совсем понимаю, что именно я делаю не так в этом случае.

1 Ответ

0 голосов
/ 26 сентября 2018

Это не имеет ничего общего с пространствами имен.Вы объявляете c'tor с определенным прототипом в заголовке:

Ship(int length, int width, std::string name);

, а затем случайным образом добавляете параметр с аргументом по умолчанию в файле реализации:

Federation::Ship::Ship(int length, int width, string name, int speed = 1)

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

Ship(int length, int width, string name, int speed = 1);
// and
Federation::Ship::Ship(int length, int width, string name, int speed)
...