在这种情况下如何使用decltype

时间:2015-10-02 14:47:19

标签: c++ using decltype

这是我的代码:

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;
}

在类中,函数可以像上面一样返回a的元素。 a.find(key)->second的类型非常复杂,所以我不想全部输入。事实上,我甚至不知道如何打字......

所以我想像上面那样使用decltype但是失败了。这是错误:

  

错误C2227:' - > second'的左边必须指向class / struct / union / generic type

1 个答案:

答案 0 :(得分:5)

您必须向上移动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);