1) Если функция view
определена как:
void view(std::ostream output, std::string text) // (1)
{
output << text;
}
И используется:
view(std::cout, "Hello, World!"); // (2)
Тогда сообщение об ошибке задается компилятором:
В MSVC:
blockquote>
error C2280: 'std::basic_ostream
>::basic_ostream(const std::basic_ostream > &)': attempting to reference a deleted function GCC:
blockquote>
error: use of deleted function 'std::basic_ostream<_CharT, _Traits>::basic_ostream(const std::basic_ostream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits
]' Clang:
blockquote>
error: call to deleted constructor of 'std::ostream' (aka 'basic_ostream
') 2) Для объявления
[1137 ] Отображается следующее сообщение об ошибке:std::ostream os;
MSVC:
blockquote>
error C2512: 'std::basic_ostream
>': no appropriate default constructor available GCC:
[ 1110]
blockquote>Clang:
blockquote>
error: calling a protected constructor of class 'std::basic_ostream
' Причина:
Это все в соответствии со спецификацией std :: basic_ostream
Нет определения для конструктора по умолчанию - поэтому переменная типа
std::ostream
не может быть создана без конкретных параметров конструктора. [ 1145]И, как говорится в C ++ Reference, о конструкторе копирования std :: basic_ostream :
Конструктор копирования защищен и удален. Выходные потоки не копируются.
blockquote>Объяснение:
1) Итак, проблема в том, что в
(2)
параметрstd::cout
был передан функции, которая определена в(1)
скопироватьstd::ostream
в переменнуюoutput
.Но определение класса говорит, что конструктор копирования не может быть использован, поэтому компилятор выдает сообщение об ошибке.
2) В случае создания переменной
os
- она не дает никаких параметров конструктора, нет конструктора по умолчанию, поэтому компилятор выдает сообщение об ошибке.Как это исправить?
1) В объявлении функции измените определение, чтобы в качестве параметра взять ссылку (
[113 ]&
) наstd::ostream
:Это позволяет ему использовать оригинальный объект вместо копирования (что копирование запрещено).
2) Если требуется переменная, то также следует использовать ссылку;
std::ostream& out = std::cout;
Вы должны быть очень осторожны с именами методов. В этом случае имя метода просто « lowercaseString
», а не « lowercaseString:
» (обратите внимание на отсутствие двоеточия). Вот почему вы получаете NO
, так как объекты NSString
отвечают на сообщение lowercaseString
, но не на lowercaseString:
Сообщение.
Как узнать, когда нужно добавить двоеточие? Вы добавляете двоеточие к имени сообщения, если добавляете двоеточие при его вызове, что происходит, если он принимает один аргумент. Если он принимает нулевые аргументы (как в случае с lowercaseString
), то двоеточие отсутствует. Если требуется более одного аргумента, вы должны добавить дополнительные имена аргументов вместе с их двоеточиями, как в , сравните: options: range: locale:
.
Вы также можете посмотреть на документацию и отметьте наличие или отсутствие висящей ободочной кишки.
Селекторы являются эффективным способом ссылки на методы непосредственно в скомпилированном коде - компилятор - это то, что фактически присваивает значение в SEL.
Другие уже охватили вторую часть вашего q, в конце ':' совпадает с сигнатурой, отличной от той, которую вы ищете (в этом случае эта сигнатура не существует).
Не думайте о двоеточии как о части имени функции, думайте о ней как о разделителе, если вы не У вас нет ничего, что можно отделить (никакого значения для функции), тогда вам это не нужно.
Я не уверен, почему, но все эти вещи в ОО, кажется, чужды разработчикам Apple. Я настоятельно рекомендую взять Visual Studio Express и поиграть с этим тоже. Не потому, что одно лучше другого, просто это хороший способ взглянуть на проблемы дизайна и способы мышления.
Как и
introspection = reflection
+ before functions/properties = static
- = instance level
Всегда хорошо смотреть на проблему по-разному, и программирование - это главная загадка.
Это потому, что вы хотите @selector (lowercaseString)
, а не @selector (lowercaseString :)
. Есть небольшая разница: второй подразумевает параметр (обратите внимание на двоеточие в конце), но - [NSString lowercaseString]
не принимает параметр.
Метод NSString - lowercaseString
(0 аргументов), а не lowercaseString:
(1 аргумент).
В этом случае имя селектора неправильно. Двоеточие здесь является частью сигнатуры метода; это означает, что метод принимает один аргумент. Я считаю, что вы хотите
SEL sel = @selector(lowercaseString);