2016-12-06 1 views
6

다음 프로그램 호환 C++ 11입니까? 그렇다면 트리거하는 특정 MSVC 버그를 알고 계십니까? 및/또는 가능한 해결 방법? 실제 유형 decltype 대체하는 경우오버로드 된 템플릿 함수의 MSVC2015 decltype 매개 변수 유형

#include <iostream> 

struct A {}; 
struct B {}; 

constexpr A aaa = {}; 
constexpr B bbb = {}; 

template <typename T> 
void foo(T, decltype(aaa)) { std::cout << "a"; } 

template <typename T> 
void foo(T, decltype(bbb)) { std::cout << "b"; } 
//^C2995 'void foo(T,unknown-type)': function template has already been defined 

int main() 
{ 
    foo(0, aaa); 
    foo(0, bbb); 
} 

는 다음 작동하지만, 실제로 이러한 유형의도 재현 복잡하고 나는 그들을 위해 별칭을하지 않으려는 것입니다.

+0

컴파일 gcc/clang을 사용하면 문제가 없으며 C++ 11을 준수하지 않는 것도 볼 수 없습니다. – Jarod42

답변

4

다음 약간의 수정과 나를 위해 작품 (VS 2015/v140) :

#include <iostream> 

struct A {}; 
struct B {}; 

constexpr A aaa = {}; 
constexpr B bbb = {}; 

using A_type = decltype(aaa); 
using B_type = decltype(bbb); 

template <typename T> 
void foo(T, A_type) { std::cout << "a"; } 

template <typename T> 
void foo(T, B_type) { std::cout << "b"; } 

int main() 
{ 
    foo(0, aaa); 
    foo(0, bbb); 
} 

하지만이 변종은 (그것을 만들 확실하지) 같은 오류가 산출 :

template <typename T> 
struct TypeWrapper { 
    using type = T; 
}; 

template <typename T> 
void foo(T, typename TypeWrapper<decltype(aaa)>::type) { std::cout << "a"; } 

template <typename T> 
void foo(T, typename TypeWrapper<decltype(bbb)>::type) { std::cout << "b"; } 
+0

MSVC가 별칭을 텍스트로 대체한다고 생각했습니다. 나는 그것이 작동하고 놀랍다. 오래 전이 '알 수없는 유형'과 관련이있는 몇 가지 불쾌한 버그를 다루었습니다. 별칭이 작동하고 있음을 알았습니다. –

+0

@GuillaumeRacicot : 유형 별칭이 새로운 별도의 유형으로 간주되지 않습니다. 맞습니까? 나는 오히려 당신이 그것을 가져 왔을 때 오히려 그것이 자신을 작동하지 않을 것이라고 기대하고 싶습니다. 외관상으로는 컴파일러를 혼란스럽게하는 타입 자체가 아니라'decltype()'구조체입니다. 제 수정은 컴파일러가 올바르게 처리 할 수있는 다른 컨텍스트에 넣습니다. 적어도 그것은 현재의 이론입니다. –

+0

명백하게 이것 역시 작동합니다 :'template wrap = T;를 사용하여'wrap '를 매개 변수 목록에 넣으십시오. –

관련 문제