2011-12-02 40 views
0

我想要一個帶有模板轉換運算符和默認構造函數的模板化類,但是我的初始嘗試不起作用。具有默認構造函數的模板類中的模板轉換運算符?

template<typename T> 
class C 
{ 
public: 
    C() {} 

    template<typename U> 
    operator U() 
    { 
     C<U> c; // (*) 
     c._a = dynamic_cast<U*>(_a); 
     return c; 
    } 
private: 
    T* _a; 
}; 

但是現在,當我嘗試創建一個C的實例,

template<typename T> 
void F() 
{ 
    ... 
    C<T> obj; 
} 

運營商U()保持一遍又一遍自稱在(*),最終段錯誤。同樣的事情發生在我定義外部轉換並從操作符U()調用它的函數時 - 在這種情況下,類定義中沒有對C :: C()的調用。

在我看來,當我想調用默認構造函數時,轉換運算符會被調用 - 它本質上是試圖自我轉換。但是,有辦法做我想做的事情嗎?

回答

1

請注意,在operator X(其中X是一種類型)函數中,通常應返回X類型的東西。你返回一個C<U>當你試圖調用對象轉換爲U這會導致以下情況發生:

  1. int a = someC;(其中someC是任何類型的C)將嘗試指派C<X>到一個int
  2. operator T<int>將在someC調用它會返回一個C<int>,然後嘗試將其分配到一個int
  3. operator T<int>將在上述的返回值,這將換貨政叫氡一個C<int>
  4. 返回值是一個C<int>將嘗試轉換爲int,它將調用operator T<int> ....
  5. goto 3;

希望你可以看到爲什麼無限遞歸和隨後的堆棧溢出發生。

您不能從類Coperator T<U>返回C<U>。如果你需要出於某種原因,你需要重新設計你的班級。

+0

哈,太棒了!聽起來像你釘牢它。實際上,我想要將C 轉換爲C 。所以我想我應該嘗試'操作員C '?我不在電腦上,所以我明天會檢查一下。我認爲這是一個如此低級別的錯誤,但仍然編譯的代碼是扔給我的,但無論如何,謝謝,這聽起來很有希望。 –

+0

@MattPhillips嘗試'模板運營商C (){...}'(其實是的,正是你所說的) –

+1

哦,不,你用了一個goto! ;) –

相關問題