См. Расширение параметра в man bash
:
${parameter#word} ${parameter##word}
Удалить соответствующий шаблон префикса. Слово расширяется для создания шаблона так же, как при расширении пути. Если шаблон совпадает с началом значения параметра, то результатом расширения является расширенное значение параметра с кратким шаблоном соответствия (случай
#
) или самый длинный шаблон соответствия (случай##
). Если параметр равен @ или *, операция удаления паттерна применяется поочередно по каждому позиционному параметру, а расширение - это результирующий список. Если параметр представляет собой переменную массива с индексом @ или *, операция удаления шаблона применяется поочередно к каждому члену массива, а расширение - результирующий список.${parameter%word} ${parameter%%word}
Удалить соответствующий шаблон суффикса. Слово расширяется для создания шаблона так же, как при расширении пути. Если шаблон соответствует конечной части расширенного значения параметра, то результатом расширения является расширенное значение параметра с кратчайшим шаблоном соответствия (случай
blockquote>%
) или самый длинный шаблон соответствия (случай%%
), удален. Если параметр равен @ или *, операция удаления паттерна применяется поочередно по каждому позиционному параметру, а расширение - это результирующий список. Если параметр представляет собой переменную массива, подстроенную с помощью @ или *, операция удаления шаблона применяется поочередно к каждому члену массива, а расширение является результирующим списком.Короче ,
#
удаляет рисунок слева,%
справа, удвоение символа делает совпадающим жадным. (Мнемоника:#
находится слева от%
на большинстве клавиатур).
Вы пропустили точку с запятой после вашего определения struct
.
Ошибка правильная, конструкторы не имеют возвращаемого типа. Поскольку вы пропускаете точку с запятой, все определение структуры рассматривается как тип возвращаемого значения для функции, например:
// vvv return type vvv
struct { /* stuff */ } foo(void)
{
}
Добавьте точку с запятой:
struct B
{
int* a;
B(int value):a(new int(value))
{ }
B():a(nullptr){}
B(const B&);
}; // end class definition
// ah, no return type
B::B(const B& pattern)
{
}
Вам нужен компилятор получше. В g ++:
a.cpp:1: error: new types may not be defined in a return type
a.cpp:1: note: (perhaps a semicolon is missing after the definition of 'B')
a.cpp:5: error: return type specification for constructor invalid
Точка с запятой необходима, потому что она завершает возможный список экземпляров структуры:
struct B {
...
} x, y, z;
Создает три экземпляра B, называемых x, y и z. Это часть наследия C ++, и он все еще будет присутствовать в C ++ 0x.