1

的VisualStudio不能編譯這個代碼(錯誤C2976)VS2015錯誤C2976

但GCC和鏘可以編譯該代碼

爲什麼???

#include <iostream> 
#include <map> 

template <typename... ARGS> 
void Func(const std::map<ARGS...>& m) 
{ 
    //... 
} 

template <typename T> 
void Func(const T& t) 
{ 
    //... 
} 

int main() 
{ 
    std::map<int, double> m; 
    Func(m); // error C2976: 'std::map': too few template arguments 
    Func(123); // OK 
    return 0; 
} 
+1

它顯示任何錯誤? –

+1

[std:map作爲模板參數的模板扣除失敗]的可能重複(http://stackoverflow.com/questions/26059219/template-deduction-fails-for-stdmap-as-template-parameter) – cromod

回答

1

我的猜測是,這是因爲的Visual Studio 2015年不完全支持嵌套的可變參數模板,也不能推斷出正確的類型。

這樣的工作,你身邊有明確指定的類型,所以您可以使用Func<std::map<int, double>>(m);Func<int, double>(m);甚至Func<decltype(m)>(m);(我推薦的最後一個)。