Невозможно полностью определить имя класса в внеклассном объявителе определения функции

12

Эта программа приводит к нежелательному тупику разбора:

struct float4x4 {};
class C
{
    float4x4 M();
};

float4x4 ::C::M()
{
    return float4x4{};
}

: 8: 1: ошибка: нет члена с именем 'C' в 'float4x4'; Вы имели в виду просто «С»?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Который может быть «исправлен» с использованием конечного типа возврата:

auto ::C::M() -> float4x4
{}

сейчас все хорошо.

Итак, я так понимаю, мы не можем полностью определить имя класса при использовании синтаксиса объявления заголовка-возвращаемого типа?

v.oddou
источник
2
Пока C ++ игнорирует пробелы вокруг ::, я полагаю, что другого пути нет.
Иксисарвинен
@Someprogrammerdude да, проверьте это godbolt.org/z/mt6GHD
v.oddou
3
::CЧасть выглядит как обходной путь для какого - то другого вопроса. Иначе это могло бы быть просто C(как подсказывает компилятор;)
rustyx
2
@rustyx - это просто механическое переиздание кода транспортером, который не хочет выполнять сверхсложное «найти наименее подходящее имя» в этой позиции. испускание FQ-имени полностью обходит поиск и удобно для таких инструментов.
v.oddou

Ответы:

10

Вы можете поставить скобки для устранения неоднозначности:

float4x4 (::C::M)()
{
    return float4x4{};
}

Я не могу сказать вам, какое правило делает это нормально, хотя оно не без скобок, хотя я тестировал с gcc и clang (оба -pedantic). Я бы предпочел конечный тип возврата.

idclev 463035818
источник
1
невероятно. действительно мы можем. godbolt.org/z/KCFbJZ это отвратительно, но это круто . Конечно, с точки зрения стиля, трейлинг отличный. Но в моем случае я нацеливаюсь на диалект, который его не поддерживает.
v.oddou