簡體   English   中英

C ++模糊模板實例化

[英]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參數輸入不一致(也就是說, MN在這里是int ,但是size_t在那里)。 這意味着並非所有模板變量賦值都可以在另一個中使用,這意味着沒有部分排序,因此錯誤消息。

聯合模板非類型參數類型,它應該工作。

我測試過Clang,GCC和Comeau的代碼。 當GCC和Clang接受它時,Comeau拒絕它。 我認為,對於這兩組編譯器,可以提出要點

  • Comeau遵循C ++ 03規則,該規則要求推導出的模板參數“完全匹配(因此推論不依賴於隱式轉換)”。 然而,這個規范非常嚴格 ,並且已經完全重寫為C ++ 0x。

  • Clang和GCC似乎實現了重寫規則,這條規則更好地指定了“完全匹配”的含義。 該規范適用於不同類型的陣列尺寸。

在任何情況下,如果你想對所有編譯器都很好,那么真的按照接受的答案並將非類型參數類型更改為常見類型:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM