2011-12-01 64 views
0

我想模板鑄造操作員與專業化的布爾,但它不工作。模板鑄造操作員和部分專業化

template<typename T> //Don't know if the fact that C is templated itself is relevant here 
class C 
{ 
... 
     template<typename U> operator U() const { return another_namespace::MyCast<U>(*this); } 
     template<> operator bool() const { return IsValid(); } 
}; 

這使我(克++ 4.6)

非命名空間範圍

顯式特 'C類< T>'

現在只需

operator bool() const { return IsValid(); } 

由本身就像MyCast一樣工作(這是在外部名稱空間中聲明的朋友函數) E)。有什麼方法可以讓我在這裏得到預期的behHoavior?

編輯:我後來發現this,看起來像相同的基本問題,但答案(這提供了一個非常複雜的解決方案)看起來專爲字符串設計。另外,那裏的問題變成了含糊不清,我認爲這不是問題 - 我得到了一個非常不同的編譯器錯誤消息。

+1

不就做你想做的,如果你只是使用非模板'運營商布爾()'? – sth

+0

@sth哈!看起來像。事實證明這是一個很大的程序,我還有很多其他的錯誤需要我去解決,但是編譯器通過了包含類C的文件。沒有意識到非專業化是一種選擇。把你的回答作爲答案,只要一切正常,你就會得到信用。 –

+0

好的,這裏你去:) – sth

回答

3

可以重載轉換操作符,所以只需使用operator bool()的非模板版本應該工作:

template<typename T> 
class C 
{ 
... 
     template<typename U> operator U() const { ... } 
     operator bool() const { ... } 
}; 
0

我想專門類型轉換操作模板和我有同樣的問題,當我確定類定義內的專業化。但是當我搬到外面時,它就像一個魅力!

實施例定義:

struct A { 
    int i; 
    A(int v) : i(v) { 
    cout << __PRETTY_FUNCTION__ << endl; 
    } 
    template <typename T> 
    operator T() { 
    cout << __PRETTY_FUNCTION__ << " - NOT IMPLEMENTED" << endl; 
    throw; 
    return 0; 
    } 

    // Compilation error 
    // error: explicit specialization in non-namespace scope ‘struct A’ 
    //template <> 
    //operator double() { 
    // cout << __PRETTY_FUNCTION__ << " - !!! IMPLEMENTED" << endl; 
    // return (double)i; 
    //} 
}; 
// But this works well!! 
template <> 
A::operator double() { 
    cout << __PRETTY_FUNCTION__ << " - !!! IMPLEMENTED" << endl; 
    return (double)i; 
} 

實施例主要:

A a(5); 
double d = a; 
long l = a; 

輸出:

A::A(int) 
A::operator T() [with T = double] - !!! IMPLEMENTED 
A::operator T() [with T = long int] - NOT IMPLEMENTED 
terminate called without an active exception 

測試:克++(Debian的4.7.2-5)4.7.2沒有任何額外的ARGS。

我會嘗試下大年紀了G ++,以及...