2016-06-27 1 views
2

another question을 이해하려고 시도하면서 다음 코드를 얻는 예제를 단순화했습니다.clang ++ 템플릿 기반 클래스에서 템플릿 메서드의 특수화에 대한 자동 반환 형식 오류가 있습니까?

template <bool> 
struct foo 
{ 
    template <typename T> 
     auto bar (int i) 
     { return i; } 
}; 

template <> 
template <typename T> 
    auto foo<true>::bar (int i) 
    { return i; } 

int main() 
{ 
    return 0; 
} 

g ++ 4.9.2 문제없이 컴파일하십시오. 그 소리 ++ 3.5은 다음과 같은 오류 int와 두 auto 반환 값 중 하나를 대체

tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not 
     match any declaration in 'foo<true>' 
    auto foo<true>::bar (int i) 
        ^~~ 

주고, 변경은 없습니다 : g ++ 컴파일 및 그 소리 ++주고 오류가. 두 autoint으로 바꾸면 오류가 사라집니다. 누가 맞아 : 다음 코드는

template <bool> 
struct foo 
{ 
     auto bar (int i) 
     { return i; } 
}; 

template <> 
    auto foo<true>::bar (int i) 
    { return i; } 

int main() 
{ 
    return 0; 
} 

내 질문은 분명하다 모두 컴파일러로 문제없이 컴파일하기 때문에

template <typename T> 부분은 중요하다?

g ++ 또는 clang ++?

g ++이 맞고 이것이 clang ++의 버그라고 생각하지만 확인을 요청합니다.

p.s .: 죄송합니다.

+1

해보십시오 GCC 6.1 및 이것은 연타 문제였다 3.8 .. –

+1

을 연타. 그것은 3.8에서 작동합니다 : https://godbolt.org/g/JkCJ6l – refi64

답변

0

동일한 문제가 있었는데 여기에 solution이 있습니다. 암시 적 자동 리턴 유형은 C++ 14 이후에만 허용되므로 컴파일시 -std=c++14 컴파일 플래그를 사용하거나 리턴 유형 (C++ 11의 경우)을 명시 적으로 설정해야합니다.

문제는 CLang이 템플릿 클래스의 템플릿 기능을 잘 전문화하지 못한다는 것입니다. 이 문제를 극복하기 위해 당신은 템플릿 클래스와 별도의 전문의 빈 선언이 있어야합니다

template <bool> 
struct foo; 

template <> 
struct foo <false> 
{ 
    template <typename T> 
    auto bar (int i) 
    { return i; } 
}; 


template <> 
struct foo <true> 
{ 
    template <typename T> 
    auto bar (int i) 
    { return i; } 
}; 

int main() 
{ 
    return 0; 
} 
+0

노력에 감사하지만 "솔루션"에 대한 링크는 내 질문에서 인용 한 "다른 질문"과 동일한 링크입니다. 그리고 받아 들여진 "해결책"은 그 질문에 대한 나의 대답입니다. 그리고 분명히 C++ 14, C++ 11이 아닌 태그에 대한 이야기 ​​(C++ 11 태그가 없습니다). 내 질문은 "해결하는 방법"이 아닙니다. 그러나 "누가 옳은가?". 당신은 (나는 정확하게 이해한다면) "g ++가 맞고 clang ++가 틀렸다"고 말하고 있습니다. 그러나 나는 공식 표준의 관련 부분을 인용하는 대답에서 희망을 품고 있었다. (나의 나쁜 영어를 위해 미안하다). – max66

+0

안녕하세요 @ max66, 미안하지만, 나는 즉시 당신을 인식하지 못했습니다. 당신은 처음 솔루션을 제공 한 사람이었습니다. 저에게있어서 "누가 옳은가"라는 질문은 없습니다. 표준은 정의이기도 한 템플릿 선언을 허용하고 템플릿 전문화를 허용합니다. 그래서, 분명히 CLang은 템플릿 클래스 선언이 정의 된 경우에 템플릿 클래스 specializetion의 템플릿 함수 정의를 작성하지 못합니다. CLang이 아직 젊지 않고 CLang 3.8.1이 GCC 4.2.1 (꽤 오래된 버전)과 호환되기 때문에 CLAR 버그는 아니며 아직 구현되지 않았습니다. – luart

관련 문제