I am trying to tow using the SFINAE template to determine if two classes can be added. This is mainly for a better understanding of how SFINAE works, and not for any specific "real world" reason.
So what I came up with
#include <assert.h> struct Vec { Vec operator+(Vec v ); }; template<typename T1, typename T2> struct CanBeAdded { struct One { char _[1]; }; struct Two { char _[2]; }; template<typename W> static W make(); template<int i> struct force_int { typedef void* T; }; static One test_sfinae( typename force_int< sizeof( make<T1>() + make<T2>() ) >::T ); static Two test_sfinae( ... ); enum { value = sizeof( test_sfinae( NULL ) )==1 }; }; int main() { assert((CanBeAdded<int, int>::value)); assert((CanBeAdded<int, char*>::value)); assert((CanBeAdded<char*, int>::value)); assert((CanBeAdded<Vec, Vec>::value)); assert((CanBeAdded<char*, int*>::value)); }
This is a compilation for everyone but the last line, which gives
finae_test.cpp: In instantiation of 'CanBeAdded<char*, int*>': sfinae_test.cpp:76: instantiated from here sfinae_test.cpp:40: error: invalid operands of types 'char*' and 'int*' to binary 'operator+'
So, this error refers to what I would expect, but I would expect the compiler to then find the definition of test_sfinae (...) and use it instead (and will not complain about the one that is not parsing.
Itβs clear that Iβm missing something, I just donβt know what it is.
source share