Это из-за причуды в синтаксисе C ++.
Поскольку класс функции-члена уточняется только в тот момент, когда объявляется имя самой функции, все, что до этого должно быть полностью прописано.
ReturnType
ClassName
:: // only here do we enter the scope 'ClassName'
FunctionName
(
ArgumentType0,
ArgumentType1,
...
) {
}
Эту проблему можно преодолеть с помощью синтаксиса позднего типа возврата C ++ 0x
auto
ClassName
::
FunctionName
(
ArgumentType0,
ArgumentType1,
...
)
->
ReturnType
{
}
Поскольку он откладывает объявление возвращаемого типа достаточно долго, чтобы войти в область действия (это также позволяет объявить его на основе аргументов функции, например, используя decltype
).