0

我一直在努力解決這個問題一段時間,似乎無法用所有的模板和專業化解決問題。我想我錯過了靜態功能internal_set_BC的定義,但我不確定。當我編譯下面的代碼,我收到以下錯誤:錯誤:不完整類型的使用無效(也許是一個定義問題)

test.cc:37:49: error: invalid use of incomplete type ‘class RT<2, D>’ 
static void RT<2, D>::internal_set_BC(D& d, T& t) 
               ^
test.cc:19:7: error: declaration of ‘class RT<2, D>’ 
class RT: public BC<n, D> 
    ^
test.cc:41:49: error: invalid use of incomplete type ‘class RT<3, D>’ 
static void RT<3, D>::internal_set_BC(D& d, T& t) 
               ^
test.cc:19:7: error: declaration of ‘class RT<3, D>’ 
class RT: public BC<n, D> 

簡化代碼如下:

class A {}; 
class B {}; 
class C {}; 
class E {}; 

template <int n> 
class Base 
{}; 

template <int n, typename D> 
class BC: public Base<n> 
{ 
public: 
    virtual void set_BC(D& d, A& a) =0; 
    virtual void set_BC(D& d, B& b) =0; 
}; 

template <int n, typename D> 
class RT: public BC<n, D> 
{ 
public: 
    void set_BC(D& d, A& a) 
    {internal_set_BC(d, a);} 
    void set_BC(D& d, B& b) 
    {internal_set_BC(d, b);} 
private: 
    template <typename T> 
    static void internal_set_BC(D& d, T& t); 
}; 

template <typename D, typename T> 
static void RT<2, D>::internal_set_BC(D& d, T& t) 
{//code 
} 
template <typename D, typename T> 
static void RT<3, D>::internal_set_BC(D& d, T& t) 
{//code 
} 

而且,當我嘗試實例internal_set_BC與此代碼:

template void RT<2, C>::internal_set_BC(C& d, A& t); 

我得到這個錯誤:

test.cc:45:51: error: explicit instantiation of ‘static void RT<n, D>::internal_set_BC(D&, T&) [with T = A; int n = 2; D = C]’ but no definition available [-fpermissive] 
template void RT<2, C>::internal_set_BC(C& d, A& t); 

這支持我對上述代碼中缺少定義的懷疑。

您的幫助是非常appriciated。

回答

1

你不能。您只能爲完整的專業化做這樣的事情:

template <> 
template <typename T> 
static void RT<2, int>::internal_set_BC(int& d, T& t) 
{//code 
} 

int就是例子。你應該寫部分類專業化。

template<typename D> 
class RT<2, D> : public BC<2, D> 
{ 
// public functions set_BC. 
private: 
    template <typename T> 
    static void internal_set_BC(D& d, T& t); 
}; 

template <typename D> 
template <typename T> 
void RT<2, D>::internal_set_BC(D& d, T& t) 
{//code 
} 

你也可以寫這樣的事情,只有internal_set_BC專攻:

template<int n, typename D, typename Impl> 
class RT_base : public BC<n, D> 
{ 
public: 
    void set_BC(D& d, A& a) 
    { 
    Impl::internal_set_BC(d, a); 
    } 
    void set_BC(D& d, B& b) 
    { 
    Impl::internal_set_BC(d, b); 
    } 
}; 

template <int n, typename D> 
class RT: public RT_base<n, D, RT<n, D> > 
{ 
    friend class RT_base<n, D, RT<n, D> >; 
    template <typename T> 
    static void internal_set_BC(D& d, T& t); 
}; 

template<typename D> 
class RT<2, D> : public RT_base<2, D, RT<2, D> > 
{ 
    friend class RT_base<2, D, RT<2, D> >; 
    template <typename T> 
    static void internal_set_BC(D& d, T& t); 
}; 

template <typename D> 
template <typename T> 
void RT<2, D>::internal_set_BC(D& d, T& t) 
{//code 
} 

或更簡單,無需CRTP

template<int n, typename D> 
class RT_Base : public BC<n, D> 
{ 
protected: 
    template<typename T> 
    static void internal_set_BC(D& d, T& t); 
}; 

template<typename D> 
class RT_Base<2, D> : public BC<2, D> 
{ 
protected: 
    template <typename T> 
    static void internal_set_BC(D& d, T& t); 
}; 

template <typename D> 
template <typename T> 
void RT_Base<2, D>::internal_set_BC(D& d, T& t) 
{//code 
} 

template<int n, typename D> 
class RT : public RT_Base<n, D> 
{ 
public: 
    void set_BC(D& d, A& a) 
    { 
    this->internal_set_BC(d, a); 
    } 
    void set_BC(D& d, B& b) 
    { 
    this->internal_set_BC(d, b); 
    } 
}; 
+0

謝謝!我已經添加了部分專業化(第二段代碼段),並且我不再有錯誤。我想知道是否有參考資料或書籍可以深入解釋模板,從而將這些專業化問題作爲問題的一部分。 –

1

。在你的代碼中的另一個問題。 您已經在class BC定義

virtual void set_BC(D& d, A& a) =0; 

但你已經實現了(在class RT

void set_BC(const D& d, A& a) 

額外const使得這個第二個函數不是覆蓋,因此RT仍然是抽象的。

+0

你是對的。這是我在簡化代碼時犯的一個錯誤。我現在修好了。 –

相關問題