Неможливо повністю кваліфікувати ім’я класу в позакласовому деклараторі визначення функції


12

Ця програма призводить до небажаного розбору жадібності в тупику:

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

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

: 8: 1: помилка: жоден член з ім'ям "C" у "float4x4"; ти мав на увазі просто "С"?
float4x4 :: C :: M ()
^ ~~~~~~~~~~~

Що можна "виправити", використовуючи зворотний тип повернення:

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

тепер все добре.

Отже, я вважаю, що ми не можемо повністю визначити ім'я класу під час використання синтаксису декларатора заголовка типу?


2
Поки C ++ ігнорує пробіли навколо ::, я думаю, іншого шляху немає.
Yksisarvinen

@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). Я вважаю за краще типовий тип повернення.


1
неймовірно. насправді ми можемо. godbolt.org/z/KCFbJZ це огидно, але це приголомшливо. Звичайно з точки зору стилю, трейлінг чудовий. Але в моєму випадку я націлюю діалект, який не підтримує його.
v.oddou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.