Haha the error is nice:

Code:
template<typename T> CTmplStringBase<T>::CTmplStringBase(const T* strData)
{
    *this = strData;
}
But the operator= is not defined yet! That you do lateron. So don't use '*this = strData' , but copy data members one-by-one. Then it works on my machine!

Further, I really really think you should not derive from your structs, because
1) it does not satisfy at all the Liskov substitution principle (just learned, but very useful)
2) it isn't a trait, and if it was so, traits are always template parameters.

You'd better have a composition: make a private/protected object of it in your string class.

http://www.ubookcase.com/book/Addiso...3586/ch34.html

it is really worth looking at this chapter.

Please find attached what I have made (very simplified) from your code.