无法在函数定义的类外声明符中完全限定类名


12

该程序导致不希望的贪婪解析的死胡同:

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

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

:8:1:错误:'float4x4'中没有名为'C'的成员; 您的意思仅仅是“ C”吗?
float4x4 :: C :: M()
^ ~~~~~~~~~~~~

可以使用尾随返回类型“固定”:

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

现在一切都好。

因此,我认为在使用heading-return-type声明符语法时,我们不能完全限定类名吗?


2
只要C ++忽略周围的空白::,我想就没有其他办法了。
Yksisarvinen

@Someprogrammerdude是的,请查看此文件godbolt.org/z/mt6GHD
v.oddou

3
::C部分看起来像是其他问题的解决方法。否则,它可能只是简单的C(如编译器建议的那样)
rustyx

2
@rustyx,只是编译器机械地重新发送代码,不想在此位置执行超复杂的“查找最低要求名称”。发出FQ名称将完全绕过查找,并且对于此类工具很方便。
v.oddou

Answers:


10

您可以使用方括号来消除歧义:

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

尽管我用gcc和clang(都是-pedantic)进行了测试,但我不能真正告诉您什么规则可以做到这一点,尽管并非没有括号,但并非没有括号。我更喜欢尾随返回类型。


1
难以置信。确实可以。godbolt.org/z/KCFbJZ令人作呕,但真棒。当然,就风格而言,拖尾效果很棒。但就我而言,我的目标是不支持它的方言。
v.oddou
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.