2012-08-05 49 views
0

我正在處理一個模板,它非常簡單。這是目前的結構:當涉及到const時,無法專門化模板

//primary template 
template<typename T> 
const T bit_cast(const BitExpr* p);  

//specialization 
template<> 
inline const BitBinExpr* bit_cast<BitBinExpr*>(const BitExpr* p) { 
    if (p->type == XOR || p->type == AND) 
     return static_cast<const BitBinExpr*>(p); 
    return nullptr; 
} 
// more specializations follow 

但是Visual Studio堅持認爲這是無效的。但是,當參數和返回類型爲而不是const時,這工作得很好。我如何說服VS接受這些代碼?

+0

如果你總是可以返回指針,也不會使用'主要模板中的const T * bit_cast'正常工作? – Mat 2012-08-05 06:25:51

回答

2

這似乎近來出現了很多。這兩種類型是不一樣的

const BitBinExpr* // BitBinExpr is constant 

typedef BitBinExpr* T; 
const T   // pointer is constant 

也許這是你在找什麼

template<typename T> const T bit_cast(const BitExpr* p);  
template<> inline const BitBinExpr *const bit_cast<const BitBinExpr *const>(const BitExpr* p) { 
    if (p->type == XOR || p->type == AND) 
     return static_cast<const BitBinExpr*>(p); 
    return nullptr; 
} 
+0

'const BitBinExpr const *'是無意義的。你是不是指'BitBinExpr const * const'?如果是這樣,那麼OP就沒有什麼更好的了。 – ildjarn 2012-08-05 06:14:51

+0

如何(令人沮喪和)令人驚訝。有沒有什麼方法來表達正確的邏輯,或者我會被迫傳遞一個const模板參數? – Puppy 2012-08-05 06:20:52

+0

@ildjarn是的,我編輯了。你爲什麼說這不起作用?這似乎是爲我工作。 – jahhaj 2012-08-05 06:21:33