Jest to raczej pytanie o standard C++. Rozważmy następujący kod:Prywatny test istnienia członka za pomocą meta-programowania, GCC vs clang, co jest zgodne z prawdą?
template <typename T>
class has_Data
{
typedef char one;
typedef long two;
template <typename C> static one test(typeof(&C::Data)) ;
template <typename C> static two test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
};
class MyClass {
private:
struct Data {
};
};
void function(bool val = has_Data<MyClass>::value) {}
Powyższy kod działa z gcc (GCC) 4.4.3
Jednak przy clang version 3.3 (2545b1d99942080bac4a74cda92c620123d0d6e9) (2ff97832e593926ea8dbdd5fc5bcf367475638a9)
daje ten błąd:
test_private_data.cpp:7:54: error: 'Data' is a private member of 'MyClass'
template <typename C> static one test(typeof(&C::Data)) ;
^
/devshared/home/rhanda/test_private_data.cpp:7:37: note: while substituting explicitly-specified template arguments into function template 'test'
template <typename C> static one test(typeof(&C::Data)) ;
^
/devshared/home/rhanda/test_private_data.cpp:21:26: note: in instantiation of template class 'has_Data<MyClass>' requested here
void function(bool val = has_Data<MyClass>::value) {}
^
1 error generated.
Który z nich ma rację?
Ze standardowego dokumentu (n3485) znalazłem oświadczenie, które wydaje się zgadzać z językiem większym niż gcc.
Access control is applied uniformly to all names, whether the names are referred to from declarations or expressions.
Co to jest typeof? – ForEveR
Czy chodziło Ci o jeden statyczny test (nazwa_klasy :: Dane *); Jestem tylko ciekawy, co 'decltype (& C :: Data)' robi dla ciebie ... – lapk
To samo .. po prostu wykrywanie, czy funkcja może być rozwiązana w pierwszej, czy nie. Jeśli zrobię zmianę w użyciu Twój kod ... robi to samo, jak przypuszczam. – RamneekHanda