[英]C++ ambiguous template instantiation
下面給出了使用nvcc(EDG前端和g ++的組合)的模糊模板實例化。 它真的很模糊,還是編譯器錯了? 我還發布了解決方案àlaboost :: enable_if
template<typename T> struct disable_if_serial { typedef void type; };
template<> struct disable_if_serial<serial_tag> { };
template<int M, int N, typename T>
__device__
//static typename disable_if_serial<T>::type
void add_evaluate_polynomial1(double *R,
const double (&C)[M][N], double x,
const T &thread) {
// ...
}
template<size_t M, size_t N>
__device__
static void add_evaluate_polynomial1(double *R,
const double (&C)[M][N], double x,
const serial_tag&) {
for (size_t i = 0; i < M; ++i)
add_evaluate_polynomial1(R, C, x, i);
}
// ambiguous template instantiation here.
add_evaluate_polynomial1(R, C, x, serial_tag());
AFAIK,問題是你的nontype參數輸入不一致(也就是說, M
和N
在這里是int
,但是size_t
在那里)。 這意味着並非所有模板變量賦值都可以在另一個中使用,這意味着沒有部分排序,因此錯誤消息。
聯合模板非類型參數類型,它應該工作。
我測試過Clang,GCC和Comeau的代碼。 當GCC和Clang接受它時,Comeau拒絕它。 我認為,對於這兩組編譯器,可以提出要點
Comeau遵循C ++ 03規則,該規則要求推導出的模板參數“完全匹配(因此推論不依賴於隱式轉換)”。 然而,這個規范非常嚴格 ,並且已經完全重寫為C ++ 0x。
Clang和GCC似乎實現了重寫規則,這條規則更好地指定了“完全匹配”的含義。 該規范適用於不同類型的陣列尺寸。
在任何情況下,如果你想對所有編譯器都很好,那么真的按照接受的答案並將非類型參數類型更改為常見類型:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.