2014-01-18 63 views
0

我有一個明確的和模板的問題:使用明確的使用模板,C++

template<class T> 
class A { 

    class A_Impl { 
     T var; 

     public: 
      explicit A_Impl(T var1) : var(var1), version(1) 
      { 
      } 

      A_Impl(const A_Impl& a) : var(a.var), version(1) 
      { 
      } 

      const A_Impl& operator=(const A_Impl& a) 
      { 
       var=a.var;++version;return *this; 
      } 

      operator T() const { return var; } 

      friend class A<T>; 
    }; 

    A_Impl a; 

public: 
    A(T var): a(var) 
    { 
    } 

    A_Impl& get() { return a; } 
}; 

void main() { 
    A<int> a1(5); 
    cout<<"a1 = "<<a1.get()<<endl; 

    a1.get()=7; 
    cout<<"a1 = "<<a1.get()<<endl; 

    a1=13; 
    cout<<"a1 = "<<a1.get()<<endl; 
} 

我得到的連接錯誤在a1.get()=7;它說沒有運營商「=」這些操作數相匹配

另外,如果我走明確的話它會編譯,但我不明白a1.get()函數和a1=13;之間的區別,它甚至在明確的情況下也能正常工作。

+0

http://stackoverflow.com/questions/121162/what-does -the-明確的關鍵字,在-C均值 – Gasim

回答

1

我在a1.get()= 7處得到en錯誤;它說沒有運營商「=」匹配這些操作數

有沒有辦法7轉換爲A_Imploperator=,因爲構造A_Impl(T),在這種情況下擴展到A_Impl(int),聲明explicit

您可以刪除explicit關鍵字,或明確創建A_Impl有:爲A_Impl

const A_Impl& operator=(const T&) 

a1.get() = A_Impl(7); 

或者你也可以聲明一個特定operator=


另外,如果我採取明確的詞了它將編譯,但我不理解a1.get()函數和A1 = 13之間的差值;即使明確也可以正常工作。

因爲模板類A不明確構造函數T(特別A(T var)),其中,在這種情況下,匹配完美T = inta1 = 13工作正常。


還要注意main應該總是返回int,不void

0

您只聲明瞭複製分配運算符:const A_Impl& operator=(const A_Impl& a), ,但不是T類型的賦值運算符:const A_Impl& operator=(const T& a)

如果您沒有explicit構造函數,則您的int(7)將被實際轉換爲A_Impl對象,然後將該對象分配給您的返回引用。

如果你的構造函數是explicit這implecit轉換是不可能的了(那是什麼explicit實際上做),因此沒有可能分配一個intA_Impl。 如果您A_Impl類是公共但是會的工作是什麼,這是(如果你不寫explicit引擎蓋下發生的一樣):

a1.get() = A_Impl(7);