this answer我真正想要做的是在我的模板參數中定義一個typename
,該模板參數可用於鑄造和返回。模板中的enable_if參數創建模板重定義錯誤
所以這樣的:
template <typename T>
typename std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type caster(T value){ return reinterpret_cast<unsigned char&>(value); }
會變成這樣:
template <typename T, typename R = std::enable_if<sizeof(unsigned char) == sizeof(T), unsigned char>::type >
R caster(T value){ return reinterpret_cast<R&>(value); }
這工作,並根據需要爲一個模板專業化的行爲,但說我再添專業化:
template <typename T, typename R = std::enable_if<sizeof(short) == sizeof(T), short>::type>
R caster(T value){ return reinterpret_cast<R&>(value); }
現在我收到一個錯誤:
error C2995: 'R caster(T)' : function template has already been defined
有沒有辦法讓編譯器相信,只有這些專門化中的一個專門針對任何給定的調用實際構建?
啊,至少我明白爲什麼現在沒有建設。好像我可以設置一個'typedef'或者一些不是用戶參數的東西,但會定義使用的類型。 – 2015-02-23 13:56:52
我在'reinterpret_cast'上看不到任何錯誤?對我來說,它應該按原樣工作。如果位數相同,那麼將另一個視爲另一個應該不會有問題? – 2015-02-23 20:54:50
@JonathanMee語言本來可以被定義,但不是。該標準包含:「如果程序試圖通過以下類型之一的glvalue訪問對象的存儲值,則行爲未定義:」後跟一個列表,該列表不包含特定大小的對象的任何註釋。一些編譯器(如GCC)使用該規則來積極優化代碼,注意到例如給定'int * a'和'long * b',存儲爲'* a'並從'* b'讀取的代碼,編譯器可以重新排序訪問,因爲指針不允許指向同一個對象。 – hvd 2015-02-23 21:07:50