我总觉得涉及到模版特化及偏特化的时候,c++的定义就显得不够严谨了,或者所牵扯的内容就会太复杂了。
就如下面这段代码,在g++下能正常编译运行了,但是在目标产品的编译器上根本编不过。。。
 
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class mystream
{
public:
    mystream():m_pos(0)
    {
        m_vContainer.reserve(1<<10);
    };
    virtual ~mystream(){};
    enum
    {
        BYTE_BIT_SIZE =8,
    };
    template <typename T > mystream& operator>>(T& a_iPara)
    {
        a_iPara = 0;
        for(int i=0; i<sizeof(T);++i)
        {
            a_iPara = ((a_iPara<<BYTE_BIT_SIZE)+m_vContainer[m_pos+i]);
        }
        m_pos += sizeof(T);
        return *this;
    }
    template <typename T > mystream&  operator<<(const T& a_iPara)
    {
        //unsigned char bttmp[sizeof(T)]=0;
        m_vContainer.insert(m_vContainer.end(),sizeof(T),0);
        vector<unsigned char >::iterator it= m_vContainer.end()-1;
        for(int i=0; i<sizeof(T);++i,--it)
        {
            *it = ((a_iPara>>(BYTE_BIT_SIZE*i))&0xff);
            //printf("operator[%d]=%x\n",i , *it);
        }
  return *this;
    }
    template <typename T > mystream& operator>>(T* a_iPara)
   {
        //cout<<"CHARSTAR"<<endl;
        if(NULL ==a_iPara)
        {
            return *this;
        }
        int i=0;
        int size = m_vContainer.size();
        int slen = 0;
        for(i=0; (i+m_pos)<size;++i )
        {
            if(m_vContainer[m_pos+i]=='\0')
            {
                slen = i;
                break;
            }
        }
        if((i+m_pos)==size)
        {
            return *this;
        }
        for(i=0; i<slen;++m_pos,++i )
        {
            a_iPara[i] = m_vContainer[m_pos];
            //cout<<m_vContainer[m_pos]<<endl;
        }
        a_iPara[i] = '\0';
        ++m_pos;
        return *this;
    }
    template <typename T >
    mystream& mystream::operator<< ( T* a_iPara)
    {
    if(NULL ==a_iPara)
  {
   m_vContainer.push_back(0);
   return *this;
  }
        for(int i=0;a_iPara[i]!='\0';++i )
        {
            m_vContainer.push_back((unsigned char)a_iPara[i]);
        }
cout<<"operator<< <T*>"<<endl;
        m_vContainer.push_back(0);
        return *this;
    }    
    template <typename T >
    mystream& mystream::operator<< (const T* a_iPara)
    {
    if(NULL ==a_iPara)
  {
   m_vContainer.push_back(0);
   return *this;
  }
        for(int i=0;a_iPara[i]!='\0';++i )
        {
            m_vContainer.push_back((unsigned char)a_iPara[i]);
        }
        m_vContainer.push_back(0);
        cout<<"operator<< <const T*>"<<endl;
        return *this;
    }
 protected:
    vector<unsigned char >m_vContainer;
    int m_pos;
};
template <>
mystream& mystream::operator>> <string>(string& a_iPara)
{
        a_iPara="";
        int i=0;
        int size = m_vContainer.size();
        int slen = 0;
        for(i=0; (i+m_pos)<size;++i )
        {
            if(m_vContainer[m_pos+i]=='\0')
            {
                slen = i;
                break;
            }
        }
        if((i+m_pos)==size)
        {
            return *this;
        }
        for(i=0; i<slen;++m_pos,++i )
        {
            a_iPara += m_vContainer[m_pos];
        }
        ++m_pos;
        cout<<"operator>> <string>"<<endl;
        return *this;
}
template <>
 mystream& mystream::operator<< <string>(const string& a_iPara)
 {
  cout<<"operator<< <string>"<<endl;
  return (*this)<<a_iPara.c_str();
 }
struct Test{};
mystream& operator<<(mystream&s,const Test&t)
{
   cout<<"Test&t>"<<endl;
 return s;
}
 
int main()
{
 printf("hello world!\n");
 char ptmp[]="hello!\n";
 char*p = "world\n";
 int i =1;
 int j=2;
 char ptmp1[20]="";
  char ptmp2[20]="";
 mystream s;
  s<<i<<ptmp<<p;
 s>>j>>ptmp1>>ptmp2;
 cout<<j<<endl;
 cout<<ptmp1<<endl;
 cout<<ptmp2<<endl;
 string str("this string\n");
 s<<str;
 string str2;
 s>>str2;
 cout<<str2;
 Test to;
 s<<to;
 return 0;
}