2010-11-23 37 views
5

考慮下面的程序:模板常量類型轉換操作符

#include <iostream> 

template<int s> 
class Pack 
{ 
public: 
    Pack(){} 
    char data[s]; 
    template<typename X> operator X&(){ return *reinterpret_cast<X*>(data); } 
    template<typename X> operator X const&()const{ return *reinterpret_cast<const X*>(data); } 
}; 

int main() 
{ 
    const Pack<8> p; 
    const double d(p); 
    std::cout<<d<<std::endl; 
} 

它在Windows下編譯罰款。 在linux下,我得到:

test.cc: In function ‘int main()’: 
test.cc:17: error: passing ‘const Pack<8>’ as ‘this’ argument of ‘Pack<s>::operator X&() [with X = double, int s = 8]’ discards qualifiers 

爲什麼?爲什麼不使用const類型轉換運算符?我怎樣才能解決這個問題,仍然有方便的模板類型轉換運算符(在const和非const版本中)。 謝謝!

+0

我收到與GCC(和Comeau)不​​同的錯誤。它沒有找到任何轉換功能。可能是因爲它正在尋找一個轉換函數,例如`operator double()`並且找不到合適的轉換函數(因爲提供的函數也有引用)。 - 如果這首先是一個好主意,爲什麼不使用一個命名的成員函數呢? – UncleBens 2010-11-23 18:05:27

+0

@UncleBens,你是正確的,見下文。 – 2010-11-23 20:25:12

回答

5

根據C++ 03標準,該代碼格式不正確,因爲模板參數推導不能推導X&X const&而不是const double

C++ 03錯過了,指出在扣除之前將引用從轉換函數的返回類型中剝離出來,因此您無法在您的情況下獲得匹配。對於C++ 0x,this will be fixed,並且包含在最新的工作文件中,因此它可能會與一些編譯器進行編譯,這些編譯器包含修復追溯。

代碼實際上有一個不同的問題:GCC 執行該缺陷報告的決議,併爲此進行比較double(它剝去cv修飾符扣除之前!)對X和反對X const。只有X匹配,因此只有第一個轉換函數是具有const Pack<8>參數的呼叫中的單個候選人 - 這就是爲什麼GCC抱怨轉換函數上缺少const。如果你嘗試下面的代碼,它會工作

// can't strip cv-qualifiers off "double const&" - there are no top-level 
// cv qualifiers present here! 
double const &d(p);