在这种情况下如何使用 decltype
How to use decltype in this case
这是我的代码:
class Test
{
private:
SomeType a;
public:
using TE = decltype(a.find("abc")->second);
TE getElement(const string &) const;
};
Test::TE Test::getElement(const string & key) const
{
return a.find(key)->second;
}
在class中,一个函数可以return一个a
的元素,就像上面那样。 a.find(key)->second
的类型很复杂,所以我不想全部输入。其实我连打字都不知道...
所以我想像上面那样使用decltype
但是失败了。这是错误:
error C2227: left of '->second' must point to class/struct/union/generic type
您必须将 a
的定义向上移动:
class Test
{
private:
SomeType a;
public:
using T = decltype(a.find("abc")->second);
...
};
或者,代替 a
,使用 std::declval
替换和表达正确的类型:
class Test
{
public:
using T = decltype(std::declval<SomeType&>().find("abc")->second);
...
private:
SomeType a;
};
请注意,您在这里遗漏了 >
:
return a.find(key)-second;
^^^
并且您的 decltype()
表达式正在查找 const char[4]
而不是 std::string const &
。所以最正确的版本是:
using T = decltype(std::declval<SomeType&>().find(
std::declval<std::string const&>()
)->second);
这是我的代码:
class Test
{
private:
SomeType a;
public:
using TE = decltype(a.find("abc")->second);
TE getElement(const string &) const;
};
Test::TE Test::getElement(const string & key) const
{
return a.find(key)->second;
}
在class中,一个函数可以return一个a
的元素,就像上面那样。 a.find(key)->second
的类型很复杂,所以我不想全部输入。其实我连打字都不知道...
所以我想像上面那样使用decltype
但是失败了。这是错误:
error C2227: left of '->second' must point to class/struct/union/generic type
您必须将 a
的定义向上移动:
class Test
{
private:
SomeType a;
public:
using T = decltype(a.find("abc")->second);
...
};
或者,代替 a
,使用 std::declval
替换和表达正确的类型:
class Test
{
public:
using T = decltype(std::declval<SomeType&>().find("abc")->second);
...
private:
SomeType a;
};
请注意,您在这里遗漏了 >
:
return a.find(key)-second;
^^^
并且您的 decltype()
表达式正在查找 const char[4]
而不是 std::string const &
。所以最正确的版本是:
using T = decltype(std::declval<SomeType&>().find(
std::declval<std::string const&>()
)->second);