[Bug c++/46764] New: std=c++0x causes compilation failure on SFINAE test for methods
bisqwit at iki dot fi
gcc-bugzilla@gcc.gnu.org
Thu Dec 2 12:52:00 GMT 2010
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46764
Summary: std=c++0x causes compilation failure on SFINAE test
for methods
Product: gcc
Version: 4.5.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: bisqwit@iki.fi
This code tests whether a class defines a method of a certain name or not.
It fails to compile on GCC when -std=c++0x is used. Without -std=c++0x, it
compiles and works fine.
#include <iostream>
struct Hello { int helloworld() { return 0; } };
struct Generic {};
// SFINAE test
template <typename T>
class has_helloworld
{
typedef char yes;
typedef struct { char dummy[2]; } no;
template <typename C> static yes test( typeof(&C::helloworld) ) ;
template <typename C> static no test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(yes) };
};
int main()
{
std::cout << has_helloworld<Hello>::value << std::endl;
std::cout << has_helloworld<Generic>::value << std::endl;
return 0;
}
With -std=c++0x, we get the following error message:
tmp5.cc:13:68: error: ISO C++ forbids in-class initialization of non-const
static member 'test'
tmp5.cc:13:68: error: template declaration of 'has_helloworld::yes test'
Without -std=c++0x, the code compiles without warnings.
Indicating that GCC misinterprets test() to be a member/variable initialization
rather than a method/function declaration, despite the parameter expression
yielding a type rather than a value.
More information about the Gcc-bugs
mailing list