2015-10-02 2 views
1

Вот мой код:
Как использовать 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, как указано выше, но не удалось. Здесь ошибка:

error C2227: left of '->second' must point to class/struct/union/generic type

+3

_How_ это не получилось? Измените точное сообщение об ошибке в вопросе. –

+2

Работает для меня после устранения очевидных проблем: http://coliru.stacked-crooked.com/a/b2b40702ad2c93cb – Petr

+0

@OpenKastle сделано. – Yves

ответ

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); 
Смежные вопросы