MSVC'de olası derleyici hatası


13

Aşağıdaki kod gcc ve clang (ve diğer birçok C ++ 11 derleyicisiyle) derlenir

#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};
}

(neredeyse) en son MSVC ile derlendiğinde

> 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

Bu bir MSVC hatası mı? Evet ise, C ++ standardında hangi terim onu ​​en iyi tanımlar?

Kodun bir kısmını

template <typename T>
class data {
 public:
  data(datatype dt) {}
  data() : data(to_datatype<T>::value) {}
};

yine de sorunsuz bir şekilde derler.


Bu tek astar farklılıkları açıklayabilir. Derleyicilerinizin ne için döndüğüne bakın std::is_same_v<char, int8_t>. Benim tahminim int8_t karakterinin char ile aynı olup olmadığı, ancak uygulamanın belgeleri kontrol etmesi gerekecek şekilde tanımlanmasıdır.
alter igel

Aslında bir hata olabilir gibi görünüyor. Bu sorun yakın zamanda açıldı ve başka raporlar da var.
alteredinstance

1
@alteredinstance Bu sorunun bu soru ile nasıl ilgili olduğunu veya önceki bağlantınızın bu konuda nasıl olduğunu görmüyorum. Google'ın bu hata mesajı için verdiği ilk bağlantıyı kopyaladınız mı? Hata mesajı çok geneldir ve birçok farklı (yasal) durumda görünebilir.
ceviz

@walnut Sorunda belirtilen kodun 231 numaralı satırında , bir MSVC sorununun toplam başlatma ile geçersiz bir bağlantısı vardır, OP kodunun yaptığı da aynıdır. Öyle ki, destek kütüphanesi son zamanlarda valueMSVC ile bir toplu tipte kullanımda benzer bir sorunla karşılaştı
alteredinstance

Yanıtlar:


8

MSVC kodu kabul etmemek yanlış olduğunu söyleyebilirim.

Göre [dcl.fct.default] / 5 C ++ 17 standart son taslağının [temp.inst] kurallara göre yapılır bir sınıf şablonu bir üye işlev varsayılan argümanlar arama adı.

Bir sınıf şablonunun [temp.inst] / 2 örtük örneğine göre , üye işlevlerinin varsayılan bağımsız değişkenlerinin somutlaştırılmasına neden olmaz ve [temp.inst] / 4'e göre , bir (açık olmayan uzmanlaşma) a) sınıf şablonu bir çağrı tarafından kullanıldığında somutlaştırılır.

to_datatype<T>::valueKodunuzda varsayılan bağımsız değişkeni kullanan bir çağrı yoktur ve bu nedenle somutlaştırılmamalıdır. Bu nedenle bir arama ile ilgili bir hata olmamalıdır valueiçinde to_datatype<char>başarısız.

(C ++ 11 standart final taslağındaki ilgili bölümler, numaralandırma dışında eşdeğer ifadelere sahiptir, bunun yerine [decl.fct.default] / 5 , [temp.inst] / 1 ve [temp.inst] / 3'e bakın .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.