次のコードは、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その問題について、その問題がこの質問にどのように関係しているか、または以前のリンクがどのように関係しているかはわかりません。グーグルがこのエラーメッセージに与える最初のリンクをコピーしましたか?エラーメッセージは非常に一般的であり、さまざまな(正当な)状況で表示されます。
—
ウォールナット
問題で言及されているコードの @walnut 行231には、集計の初期化によるMSVCの問題への無効なリンクがあり、OPのコードと同じことが行われています。たまたま、Boost Libraryが
—
遭遇しました
value
MSVCで集約型を使用する場合に同様の問題に
std::is_same_v<char, int8_t>
。私の推測では、int8_tがcharと同じであるかどうかは実装で定義されていますが、ドキュメントを確認する必要があります。