string::npos

この辺の不思議仕様がさっぱり分からない。nposとか言わずに-1って書いてよ!

いや、不思議仕様でも何でもなくて、npos は std::string::npos。-1 とは限らない。参照したリファレンスの書き方が悪かったのかなぁ。
ていうか、gcc 4.0 の Visual Studio 2005 の両方で std::string::size_type は unsigned int なわけでして。たまたま bit パターンが -1 と一緒なだけで、-1 が返ってきているわけではない。実際、そのまま出力すると 4294967295 (= 0xffffffff) であることが分かる。
というわけで、判定するなら

if ((pos = str.find_first_of(delimiter)) == std::string::npos) break;

とでもするべきです。
ちなみに自分がみる STL 周りの Reference は C/C++ Reference。ていうか、IDE を使っているならいちいち検索してないで IDE 付属のマニュアル見るのがいいと思うが。これもいわゆる RTFM 問題か?