2011-05-12 82 views
2

任何人都可以請幫我做這個工作嗎?gcc問題 - 沒有匹配的函數調用

Donor-enumerate()不起作用,gcc不提供匹配的函數錯誤。

template < class T > 
struct mesh; 

template < class T > 
struct meshBone 
{ 
    friend struct mesh<T>; 
private: 
    T *_obj; 
}; 

template < class T > 
struct mesh 
{ 
    template < class U > 
    void enumerate(U& rcv) 
    { 

    } 

    void connect(T* obj, mesh<T>* donor) 
    { 
     class object_replacement 
     { 
      T* _obj; 
     public: 
      object_replacement (T* t): _obj(t) {} 
      bool operator()(meshBone<T> * bone) 
      { 
       bone->_obj = _obj; 
       return true; 
      } 
     } obj_rpl(obj); 

     donor->enumerate (obj_rpl); 
    } 
}; 

回答

2

在C++ 03中,您不能使用本地類型作爲模板類型參數。

object_replacement是本地類型(它是mesh<T>::connect(T*, mesh*)的本地類型),並且您嘗試將其用作mesh<T>::enumerate<U>的模板參數U。 gcc給了這個相當無用的錯誤信息,即「沒有匹配的功能」。

在C++ 0x中刪除了「no local types」規則,所以如果你有一個足夠新的gcc版本,你可以使用-std=c++0x進行編譯,這應該可以正常工作(我已經用gcc 4.5驗證了這一點。 1)。如果這不是一個選項,你只需要做出object_replacement不是一個局部類型,即提取並使其嵌套類型的mesh<T>類模板:

template <class T> 
struct mesh 
{ 
    template <class U> void enumerate(U& rcv) { } 

    class object_replacement 
    { 
     T* _obj; 
    public: 
     object_replacement (T* t) : _obj(t) {} 
     bool operator()(meshBone<T>* bone) 
     { 
      bone->_obj = _obj; 
      return true; 
     } 
    }; 

    void connect(T* obj, mesh<T>* donor) 
    { 
     object_replacement obj_rpl(obj); 
     donor->enumerate(obj_rpl); 
    } 
}; 
+0

好了,我應該怎麼修改這個代碼,我可以使用哪種解決方法? – 2011-05-12 07:18:08

+0

我必須使用GCC 4.0.1,所以沒有C++ 0x對我來說 – 2011-05-12 07:22:03

+0

好吧,我知道我很笨,謝謝 – 2011-05-12 07:25:24

相關問題