I have the following template for checking if a type is std::string
or not. It compiles fine on GCC, but fails on Clang. Which is the correct behavior? Is there a way to make it work on both?
#include<iostream>
#include<string>
#include<type_traits>
using namespace std;
template <typename T> //Checks if T is string type, by testing for the existence of member type "traits_type"
class is_string
{
public:
template<typename C> std::false_type test(...);
template<typename C> std::true_type test(decltype(sizeof(typename C::traits_type)));
enum {
value = decltype(((is_string<T>*)nullptr) -> test<T>( sizeof(0) ))::value
};
};
int main() {
cout<<is_string<string>::value<<endl;
}
Error on Clang:
trial.cpp:15:51: error: member access into incomplete type 'is_string<std::basic_string<char> >'
value = decltype(((is_string<T>*)nullptr) -> test<T>( sizeof(0) ))::value
^
trial.cpp:20:7: note: in instantiation of template class 'is_string<std::basic_string<char> >' requested here
cout<<is_string<string>::value<<endl;
^
trial.cpp:8:7: note: definition of 'is_string<std::basic_string<char> >' is not complete until the closing '}'
class is_string