Are you still using the originally posted test code?
Although if you only have a single track it won't matter (or at least won't see the problem), but to be completely accurate your Blend method would need to know the totalWeight before using the current tracks weight in the division. Adding it up as you go changes the ratio each time a new tracks weight is added.
Also in your test code it appears you add two key values at time 0 and 1 (or 1 nd 2 - depending on the post), yet you increase the time value by using time++ which increments by 1 each time, skipping in between float values of time (try testing with keys at times 0 and 2 if you want to keep it like this).
It's also probably best to ensure keys are within some valid time range regardless of the time passed, and disregard animations by some other means - use curr->value if time < curr->time, use next->value if time > next->time, depends on your needs I guess.
bool FindKeys(Keyframe *& left, Keyframe *& right, real time) const{ if (!keys.empty()) { KeyList::const_iterator curr = keys.begin(); KeyList::const_iterator next = curr; for(; next != keys.end(); ++next) { if((*next)->time > time) { break; } curr = next; } if (next == keys.end) { next = curr; } left = (*curr); right = (*next); return true; } return false;}
Be mindful of any inaccuracies - treat more as a pseudo-code suggestion - depending on how you choose to handle things you may always want the true current and previous/next keys instead of them being the same key when the time is out of range.
Other than that, from the quick glance I did I don't particularly see a direct solution to your issue. May need a few more clarifications on how exactly you are handling things.