I'm trying to make a generic code that will cause a compile error if B is not an ancestor of D. What I came up with:
template<typename B, typename D>
struct assert_base_of {
enum {value = sizeof(B::D)};
}
It doesn't work. When I 'call' it like this:
assert_base_of<A2,A1>::value;
I get the following error (g++ 4.8.2):
main.cpp:16:22: error: ‘D’ is not a member of ‘A2’
It looks like the template parameter D doesn't get substituted for A1. Can anyone explain and suggest a solution please?
Inheritance does not enclose the derived class to the base class' scope so it makes no sense to use the scope resolution operator for that. The correct alternative (that also works with multiple inheritance) is to abuse the overload resolution rules:
For more information take a look into these links:
How does `is_base_of` work?
https://groups.google.com/d/msg/comp.lang.c++.moderated/xv4VlXq2omE/--WAroYkW2QJ