함수 정의의 클래스 외부 선언자에서 클래스 이름을 완전히 규정 할 수 없습니다.


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 yep, 이것을 확인하십시오 godbolt.org/z/mt6GHD
v.oddou

3
::C부분은 다른 문제에 대한 해결 방법처럼 보입니다. 그렇지 않으면 그것은 단순히 C컴파일러가 제안한 것처럼 간단했을 수 있습니다 .
rustyx

2
@rustyx이 위치에서 매우 복잡한 "최소화 된 인증 된 이름"을 실행하고 싶지 않은 트랜스 파일러에 의한 코드의 기계적 재전송입니다. FQ 이름을 방출하면 조회를 완전히 우회하고 이러한 도구에 편리합니다.
v.oddou

답변:


10

명확하게 대괄호를 넣을 수 있습니다.

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

gcc와 clang (both -pedantic)으로 테스트했지만 괄호가없는 규칙은 무엇 인지이 규칙을 실제로 알 수는 없습니다 . 후행 반환 유형을 선호합니다.


1
놀랄 만한. 실제로 우리는 할 수 있습니다. godbolt.org/z/KCFbJZ 그것은 역겹지만 굉장합니다. 물론 스타일면에서 후행은 훌륭합니다. 그러나 내 경우에는 지원하지 않는 방언을 대상으로합니다.
v.oddou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.