I\'m developing a C++ library where user\'s will provide complex inputs, such as matrices and quaternions. I don\'t want to have to reimplement these types so, internally, I
Exposing the 3rd party libraries is the easiest in the short term, but will most likely to bite you in the back in the long term. Easiest, because the types are alrady there, you do not need to come up with your own. Will bite you if you would want to use a different implementation library in the future, or would want to allow expansion of the data the client passes to you.
Using only basic types is is almost like coming up with your own, but it's much lower level, for no good reason. Your users will have a hard time using your library without constantly refering to the documentation on what's what.
Using your own types is the best option if you want flexibility down the line. It might seem like a lot of work up front as you need to re-create all the already existing types, but if you give it some tought, you might find that if you use slightly different types in your library's interface, it will facilitate implementation change better later on.
So the answer really depends on your goals and long-term plans/predictions: if you don't see yourself ever changing from your current implementation, you can go with re-using the existing types, but if you foresee/plan change in the future, you should create your own independent interface.