[英]Dependent type or argument in decltype in function definition fails to compile when declared without decltype
[英]Decltype of a container from an argument of a function
我試圖從函數的參數中扣除函數內部的stl容器的類型,它不會編譯:
auto battery_capacity( const vector<double>& v) -> decltype(v)::value_type {
decltype(v)::value_type b=0;
return b;
}
錯誤:
main.cpp:10:52: error: 'decltype(v)' (aka 'const vector<double> &') is not a class, namespace, or scoped
enumeration
auto battery_capacity( const vector<double>& v) -> decltype(v)::value_type {
^
main.cpp:11:3: error: 'decltype(v)' (aka 'const vector<double> &') is not a class, namespace, or scoped enumeration
decltype(v)::value_type b=0;
但是這會編譯:
double battery_capacity( const vector<double>& v) {
vector<double> s=v;
decltype(s)::value_type b=0;
return b;
}
更新(1)
在使用基於Kerrek答案的模板時添加:
template <typename T>
auto battery_capacity( const T& v) -> typename std::remove_reference<decltype(v)>::type::value_type {
typename std::remove_reference<decltype(v)>::type::value_type b=0;
return b;
}
如果你真的必須強制使用decltype
到這個非常簡單的代碼中(我稱之為誤導),那么就像這樣:
auto battery_capacity(const vector<double> & v) -> std::remove_reference<decltype(v)>::type::value_type
{
std::remove_reference<decltype(v)>::type::value_type b = 0;
return b;
}
如果你不確定你為什么要寫這個,你真的不想使用decltype
的。 它是一種非常專業的工具,適用於非常專業的通用庫編寫,而不適用於普通家庭用途。
當然,更簡單的答案就是寫下double battery_capacity(...)
,因為你已經知道了類型! (如果您實際上並不知道類型,那么您沒有提出正確的問題,而您的問題並未反映您的實際問題。)
在C ++ 14中,您可以縮短一點:
auto battery_capacity(const vector<double> & v)
{
return std::remove_reference_t<decltype(v)>::value_type { 0 };
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.