我無法解決這個問題。
我有一個模板類整數,它的模板引數中有它的值,我想把這個類的n 個整數加在一起。在基本情況下,我可以成功地從類中獲取 int 值,但否則會失敗。
template <int Value>
struct integer {};
template<int A, typename ...Rest>
auto constexpr add(integer<A>, Rest...) {
if constexpr (sizeof...(Rest) > 0)
return A add(Rest...);
else
return A;
}
int main(){
auto constexpr y = add(integer<1>{}); // base case
auto constexpr x = add(integer<1>{}, integer<2>{});
return 0;
}
我的猜測是元函式的引數有問題
template<int A, typename ...Rest>
auto constexpr add(integer<A>, Rest...) {...}
但我只是不知道是什么,在我看來,它應該總是能夠推斷出它的引數是一個整數,如果有 0 個引數,它甚至不應該實體化,但錯誤中似乎就是這種情況日志:
(8, 17) : error C2144 : syntax error : 'integer<2>' should be preceded by ')'
(19) : message: see reference to function template instantiation 'auto add<1,integer<2>>(integer<1>,integer<2>)' being compiled
(8, 13) : error C2672 : 'add' : no matching overloaded function found
(7, 1) : error C2780 : 'auto add(integer<Value>,Rest...)' : expects 2 arguments - 0 provided
(7) : message: see declaration of 'add'
(8, 17) : error C2144 : syntax error : 'integer<2>' should be preceded by ';'
(7, 1) : error C2059 : syntax error : ')'
(19, 52) : error C3313 : 'x' : variable cannot have the type 'const void'
[
uj5u.com熱心網友回復:
add是一個函式,而不是元函式,因為您將它設計為接受值(而不是型別);換句話說,你稱之為add(someValue)(不喜歡add<SomeType>,fwiw)。
因此,呼叫在add(Rest...)語法上是錯誤的,因為您將型別而不是值傳遞給add; 相反,您應該為該引數命名,例如rest,并在呼叫中使用它:,如add(rest...).
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515133.html
標籤:模板模板参数推导类型演绎
