関数定義のクラス外宣言子でクラス名を完全に修飾することはできません


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 '18

2
@rustyxこれは、この位置で非常に複雑な「最小修飾名を見つける」ことを実行したくないトランスパイラーによるコードの機械的な再放出です。FQ名を発行すると、ルックアップが完全にバイパスされ、そのようなツールに便利です。
v.oddou

回答:


10

大括弧を入れて明確にすることができます。

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

私はgccとclang(両方-pedantic)でテストしましたが、どのルールがこれで大丈夫かはわかりませんが、括弧がないわけではありません。末尾の戻り値のタイプを好みます。


1
信じられない。確かにできます。godbolt.org/z/KCFbJZは嫌ですが、すばらしいです。もちろん、スタイルの面では、トレーリングは素晴らしいです。しかし、私の場合は、それをサポートしていない方言をターゲットにしています。
v.oddou
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.