我試圖弄清楚這段代碼有什么問題:
#include <string>
struct Bar
{
using Deduced = typename std::string;
};
class Test
{
template<typename Foo>
auto Func() -> decltype(Foo::Deduced)
{
return Foo::Deduced();
}
};
int main()
{
Test t;
std::string ret = t.template Func<Bar>();
}
我正在重構一個類,其中Func回傳型別被宣告為類的模板類引數Test,但我想將其更改為成員模板引數。
這可能嗎?如果是,任何人都可以建議我正確的語法?
uj5u.com熱心網友回復:
洗掉decltype.
decltype給出運算式的型別。但是Foo::Deduced已經是一個型別,所以你不能申請decltype它。您只是想參考該型別本身。所以你所要做的就是寫Foo::Deduced。
但是,在某些情況下,您需要在它前面加上前綴typename以告訴編譯器它確實是一種型別。在 C 20 中,您需要typenameinreturn Foo::Deduced()但在尾隨回傳型別中不需要它。在 C 20 之前,這兩個地方都需要它。因此,您的代碼可以像這樣重寫:
template<typename Foo>
auto Func() -> Foo::Deduced
{
return typename Foo::Deduced();
}
或者可以使用推導的回傳型別:
template<typename Foo>
decltype(auto) Func() // notice no trailing return type
{
return typename Foo::Deduced();
}
uj5u.com熱心網友回復:
在這個別名宣告中
using Deduced = typename std::string;
關鍵字typename是多余的。寫就好了
using Deduced = std::string;
模板函式Func是類的私有成員函式Test。您需要將其公開。
說明decltype符需要一個運算式。你至少應該寫
auto Func() -> typename Foo::Deduced
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420590.html
標籤:
下一篇:cpp中的介面
