Тип ‘serial::serial’ присваивает имя конструктору, а не типу в C/ C

#c #c 11 #constructor #syntax-error

#c #c 11 #конструктор #синтаксическая ошибка

Вопрос:

Используя Eclipse в Ubuntu, я пытаюсь определить функцию:

 serial::serial new_serial(){
    serial handle = new serial;
    handle.setName("ttyUSB0");

    return handle;
}
 

Запускает компилятор и выдает ошибку.

 Type ‘serial::serial’ names the constructor, not the type 
 

Как это можно исправить? Что вызывает ошибку?

Комментарии:

1. Это serial класс? Вы пытаетесь определить статический метод serial , который создает экземпляр в куче?

2. То, что я пытался сделать, это передать обратно объект serial из функции, аналогично тому, как это делает конструктор.

Ответ №1:

Именно то, что говорится в сообщении: у вас есть вызываемый класс serial , и он содержит функцию конструктора, которая также названа serial , что serial::serial означает serial функцию внутри serial класса. Вы не можете использовать это в качестве возвращаемого типа функции, потому что возвращаемый тип должен быть типом, таким как класс.

Вероятно, вы хотите, чтобы тип возвращаемого значения вашей функции был либо serial (возвращающим экземпляр класса по значению), либо чем-то подобным указателю, например serial* , или (предпочтительно) std::unique_ptr<serial> . Но неясно, хотите ли вы вернуть объект или указатель, потому что строка

 serial handle = new serial;
 

также ошибочно. new Возвращает указатель, и вы не можете назначить указатель на переменную, предназначенную для хранения объекта. (Возможно, вы имеете в виду Java или C #, где большинство переменных являются ссылками. C отличается.)

Ответ №2:

У вас случайно нет класса serial в пространстве serial имен?

Если это так, вы напрашиваетесь на неприятности. Правила поиска имен обычно срабатывают при этом, поскольку ADL, возможно, включил пространство имен для поиска имен. В этом случае serial::serial это может означать класс serial в пространстве serial имен. Или это может быть конструктор класса serial .

Типичным решением является присвоение имен пространствам имен во множественном числе: serials::serial .

С другой стороны, вы используете serial unqualified внутри заводской функции, так что, вполне возможно, Wyzard решил вашу проблему…

Комментарии:

1. То, что я пытаюсь сделать, это использовать фабричный метод или функцию и в результате возвращать объект serial, настроенный с жестко заданными значениями по умолчанию.

2. @BobR: Поскольку вы отметили это с помощью C 11, я предполагаю, что вы можете использовать функции C 11. В этом случае вы, вероятно, захотите взглянуть на последнюю заводскую функцию Саттера GotW 90 .