OK, seriously, back to being helpful.
C++.
class B {
public:
virtual void validate();
};
class C1: public B {
public
virtual void validate();
};
class C2: public B {
public
virtual void validate();
};
/* dot dot dot */
class C99: public B {
public
virtual void validate();
};
You are sitting in a function that uses C99.
void foobar(C99 *c) {
c->validate();
}
You hit Ctrl+Dot, cursor is on "validate".
You should expect to get the following list of items:
function: C99::validate() // member of expected class C99
prototype: C99::validate()
function: B::validate() // member of parent class B (also relevant)
prototype: B::validate()
You might get different results with our code, here's just one example of how C preprocessing can completely screw things up.
void doobar( MYPOINTER_TO(C99) c ) {
MYFUNCTION_ENTRY
c->validate();
MYFUNCTION_EXIT
}
In this case, for numerous reasons, SlickEdit can't evaluate the type of "c", so it falls back on finding anything that is named "validate", thus you get:
function: C1::validate()
prototype: C1::validate()
function: C2::validate()
prototype: C2::validate()
...
function: C99::validate() // member of expected class C99
prototype: C99::validate()
function: B::validate() // member of parent class B
prototype: B::validate()
If SlickEdit doesn't navigate correctly, it isn't always a shortcoming of SlickEdit, it is frequently, especially for a good, strongly typed language like C++, a shortcoming of how you have your projects set up, or most often, how you have C/C++ Preprocessing configured for your code base.
Document > C/C++ Options... > C/C++ Preprocessing.
There are limits, of course, maybe you are using some obscure template meta-programming trick that is tripping up our context tagging. Who knows. I'd like to see a real example, because what you are describing appears to be a case that we handle robustly.