2013-12-20 103 views
0

我已經模板結構聲明:C++模板棘手的偏特常量+模板成員

template <bool sel_c> 
struct A 
{ 
    A(){/*...*/} 
    enum{ 
     is_straight = sel_c 
    }; 
    typedef A<sel_c> this_t; 
    typedef A<!sel_c> oposit_t; 

    A(const this_t& copy){/*...*/} 
    A(const oposit_t& copy){/*...*/} 
    ~A(); //will be specialized latter for true/false 

    template <class T> //this is my pain ! 
    void print(T& t); 
}; 

我怎麼能同時聲明print方法的特例?

我已經嘗試以下(含錯誤:錯誤C2244:「A ::打印」:無法定義的功能匹配到現有的聲明

template <class T> 
void A<false>::print(T& t) 
{ 
    /*...*/ 
} 

和之後(有錯誤,沒有副本上述早聲明的構造):

template <> struct A<false> 
{ 
    ~A() 
    { 
     /*...*/ 
    } 
    template <class T> 
    void print(T& t) 
    { 
     /*...*/ 
    } 
}; 

回答

3
template<> 
template< class T > 
void A<false>::print(T& t) {} 
0

我沒有看到你的第二個解決方案的任何問題,下面編譯只是罰款G ++:

template <bool sel_c> 
struct A 
{ 
    A(){/*...*/} 
    enum{ 
     is_straight = sel_c 
    }; 
    typedef A<sel_c> this_t; 
    typedef A<!sel_c> oposit_t; 

    A(const this_t& copy){/*...*/} 
    A(const oposit_t& copy){/*...*/} 
    ~A(); //will be specialized latter for true/false 

    template <class T> //this is my pain ! 
    void print(T& t); 
}; 

template <> 
struct A<false> 
{ 
    ~A(){}; 

    template <class T> 
    void print(T& t) {} 
}; 

template <> 
struct A<true> 
{ 
    ~A(){}; 

    template <class T> 
    void print(T& t) {} 
}; 


int main(int argc, char** argv) 
{ 
    A<false> a1; 
    A<true> a2; 
} 

編輯:這是不完整的,看評論

+0

至少我的G ++(GCC)有關錯誤4.5.3報告,我已經沒有聲明拷貝構造函數代碼'一個(A ( )) - 發生這種情況是因爲完全重新聲明瞭整個類,它刪除了以前關於有效構造函數的信息 – Dewfy

+0

有趣的是,我使用了g ++ 4.6.3,但我認爲這不會產生任何影響 – dkrikun

+1

只是添加到源代碼中代碼行:'A a; A a2(a); A b(a);'這會強制編譯器查找在沒有這些行時被忽略的構造函數 – Dewfy