2011-01-14 11 views
1

私は不満足なコンパイラエラーが発生しています。回避できないようです。これは、テンプレートの特殊化をどうするのですが、私は間違っているものを見ることができない...次のようにtemplate-idがテンプレートdelcarationと一致しません

../../include/thread/lock_guard.inl:23: error: template-id 'lock_guard<>' for 'thread::lock_guard<thread::null_mutex>::lock_guard(thread::null_mutex&)' does not match any template declaration 
../../include/thread/lock_guard.inl:23: error: invalid function declaration 
../../include/thread/lock_guard.inl:29: error: template-id 'lock_guard<>' for 'thread::lock_guard<thread::null_mutex>::~lock_guard()' does not match any template declaration 
../../include/thread/lock_guard.inl:29: error: invalid function declaration 

コードは次のとおりです。

#include "thread/mutex.hpp" 

namespace thread { 

    template <typename T> 
    class lock_guard 
    { 
     public: 
      lock_guard(T& lock); 
      ~lock_guard(); 

     private: 
      mutable T& m_lock; 
      mutable int m_state; 
    }; 

    template <> 
    class lock_guard<null_mutex> 
    { 
     public: 
      lock_guard(null_mutex&); 
      ~lock_guard(); 
    }; 

} //namespace 

#include "thread/lock_guard.inl" 

------------------------------------  

#include "thread/lock_guard.hpp" 

namespace thread { 

    template <typename T> 
    lock_guard<T>::lock_guard(T& lock) 
     : m_lock(lock), 
      m_state(lock.lock()) 
    { 
     /* do nothing */ 
    } 

    template <typename T> 
    lock_guard<T>::~lock_guard() 
    { 
     if(0 == m_state) 
     { 
      m_lock.unlock(); 
     } 
    } 

    template <> 
    lock_guard<null_mutex>::lock_guard(null_mutex&) 
    { 
     /* do nothing */ 
    } 

    template <> 
    lock_guard<null_mutex>::~lock_guard() 
    { 
     /* do nothing */ 
    } 

} //namespace 
+0

「mutable T&m_lock;」とは何でしょうか?コンパイルしないでください。 –

答えて

14

完全なクラステンプレートの特殊化は、任意のより多くのテンプレートではありません、それは普通のクラスです。

lock_guard<null_mutex>::lock_guard(null_mutex&) 
{ 
    /* do nothing */ 
} 

lock_guard<null_mutex>::~lock_guard() 
{ 
    /* do nothing */ 
} 
+0

これを書く正しい方法は、[混乱](http://llvm.org/bugs/show_bug.cgi?id=8708)時に:) –

2

は、おそらくそれは、エラーの原因ではないですが、ヘッダファイルに特化コードを必要としません。したがって、そのメンバーを定義するときは、テンプレート<>は必要ありません。

+0

あなたは実際にはそれを望んでいません。ヘッダーが複数の翻訳単位に含まれていると、複数の定義エラーが発生します。 –

+0

特殊化宣言は、ヘッダーが複数の翻訳単位に含まれている場合は、ヘッダーに含める必要があります。さもなければ、他の翻訳単位は専門化がどこかにあることを知らないので、1つの定義規則を破る。 –

+0

実装をヘッダーに単純に移しました。 – Graeme

関連する問題