title: Why this template specialization for `uint64_t` doesn't match with `unsigned long` on Mac platform?
body: <p>Why following code snippet compile failed on Mac platform using clang++?
  The <code>sizeof</code> <code>unsigned long</code> and <code>uint64_t</code> is both 8, so I think they are the same type. So why the compile think the <code>Serializer&lt;unsigned long&gt;</code> is abstract?</p>
  
  <p>Because I have define <code>Serializer&lt;uint64_t&gt;, Serializer&lt;int64_t&gt;, Serializer&lt;uint32_t&gt;, Serializer&lt;int32_t&gt;, Serializer&lt;uint16_t&gt;, Serializer&lt;int16_t&gt;, Serializer&lt;uint8_t&gt;, Serializer&lt;int8_t&gt;</code>, is there any way to resolve this issue and avoid define more type like <code>Serializer&lt;unsigned long&gt;</code>?</p>
  
  <p>Following is the error message, both clang++ and g++ give the similar result:</p>
  
  <blockquote>
    <p>example.cpp:23:31: error: variable type 'Serializer' is
    an abstract class</p>
  
  <pre><code>Serializer&lt;unsigned long&gt; s;
  
                            ^ example.cpp:6:25: note: unimplemented 
  </code></pre>
    
    <p>pure virtual method 'ToString' in 'Serializer'</p>
  
  <pre><code>virtual std::string ToString(const T* val) = 0;
  
                      ^ 1 error generated.
  </code></pre>
  </blockquote>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;vector&gt;
  #include &lt;algorithm&gt;
  template &lt;typename T&gt;
  class Serializer {
      virtual std::string ToString(const T* val) = 0;
  };
  
  template &lt;&gt;
  class Serializer&lt;uint64_t&gt; {
  public:
  
      virtual std::string ToString(const int8_t* val) {
          return "";
      }
  };
  
  int main(int argc, const char *argv[])
  {
      // both of the size is 8 bytes
      std::cout &lt;&lt; " size of unsigned long:" &lt;&lt; sizeof(unsigned long) &lt;&lt; " sizeof uint64_t:" &lt;&lt; sizeof(uint64_t);
      // following compile error happen
      Serializer&lt;unsigned long&gt; s;  //&lt;------- Error happen here
      s.ToString(NULL);
  
      return 0;
  }
  </code></pre>