다음 코드는 gcc 및 clang (및 기타 여러 C ++ 11 컴파일러)으로 컴파일됩니다.
#include <stdint.h>
typedef int datatype;
template <typename T>
struct to_datatype {};
template <>
struct to_datatype<int16_t> {
static constexpr datatype value = 1;
};
template <typename T>
class data {
public:
data(datatype dt = to_datatype<T>::value) {}
};
int main() {
data<char> d{to_datatype<int16_t>::value};
}
(거의) 최신 MSVC로 컴파일 할 때
> cl .\test.cpp /std:c++latest /permissive-
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
.\test.cpp(16): error C2039: 'value': is not a member of 'to_datatype<T>'
with
[
T=char
]
.\test.cpp(16): note: see declaration of 'to_datatype<T>'
with
[
T=char
]
.\test.cpp(20): note: see reference to class template instantiation 'data<char>' being compiled
이것은 MSVC의 버그입니까? 그렇다면 C ++ 표준에서 어떤 용어가 가장 잘 묘사됩니까?
코드의 일부를
template <typename T>
class data {
public:
data(datatype dt) {}
data() : data(to_datatype<T>::value) {}
};
어쨌든 부드럽게 컴파일됩니다.
실제로 버그 일 수 있습니다. 이 문제 는 최근에 열렸으며 몇 가지 다른 보고서가 있습니다.
—
alteredinstance
@alteredinstance 해당 문제가이 질문과 어떻게 관련이 있는지 또는 이전 링크가 그 문제와 어떻게 관련되어 있는지 알 수 없습니다. Google에서이 오류 메시지에 대한 첫 번째 링크를 복사 했습니까? 오류 메시지는 매우 일반적이며 많은 다른 (법적) 상황에서 나타날 수 있습니다.
—
호두
문제에 언급 된 코드의 @walnut Line 231에는 집계 초기화와 함께 MSVC 문제에 대한 링크가 없습니다 .OP 코드 와 동일합니다. 너무 부스트 라이브러리가 최근 사용하여 비슷한 문제로 실행하는 것을 어떻게
—
alteredinstance
value
MSVC로 집계 유형
그리고 새로운 버그 보고서 : developercommunity.visualstudio.com/content/problem/871304/…
—
marcinj
std::is_same_v<char, int8_t>
. 내 생각에 int8_t가 char과 같은지 여부는 정의 된 구현이지만 문서를 확인해야합니다.