boost::property_tree и decltype
От: Nikita.Trophimov  
Дата: 10.04.13 04:22
Оценка:
Свёл код до минимального примера:

#include <boost/property_tree/ptree.hpp>

struct Foo
{
    int bar;
};

int main()
{
    Foo instance;

    boost::property_tree::ptree pt;
    pt.get<decltype(instance.bar)>("Name");
}


MSVC-11.0 при попытке компиляции выдаёт ошибку:

error C2662: 'Type boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>>::get<int>(const boost::property_tree::string_path<std::string,boost::property_tree::id_translator<std::string>> &) const' : cannot convert 'this' pointer from 'Foo' to 'const boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>> &'


gcc 4.8.0 компилирует без проблем — http://liveworkspace.org/code/2poZzx$0

Кто прав?

Вот так ошибки уже нет:

pt.get<decltype(Foo::bar)>("Name");
Re: boost::property_tree и decltype
От: niXman Ниоткуда https://github.com/niXman
Дата: 10.04.13 07:25
Оценка:
Здравствуйте, Nikita.Trophimov, Вы писали:

NT>Кто прав?

я не вижу в этом коде ничего противоправного.
к тому же, gcc и clang компилят этот код. так что, думается мне, M$ как всегда в *опе.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: boost::property_tree и decltype
От: rusted Беларусь  
Дата: 10.04.13 08:56
Оценка:
Здравствуйте, Nikita.Trophimov, Вы писали:

NT>

NT>error C2662: 'Type boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>>::get<int>(const boost::property_tree::string_path<std::string,boost::property_tree::id_translator<std::string>> &) const' : cannot convert 'this' pointer from 'Foo' to 'const boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>> &'


Очень странный баг, словно каким-то образом он пытается использовать instance в качестве this вместо pt.

Обойти еще вот так можно:
typedef decltype(instance.bar) T;
pt.get<T>("Name");
Re[2]: boost::property_tree и decltype
От: Nikita.Trophimov  
Дата: 10.04.13 14:29
Оценка:
R>Очень странный баг, словно каким-то образом он пытается использовать instance в качестве this вместо pt.

R>Обойти еще вот так можно:

R>
R>typedef decltype(instance.bar) T;
R>pt.get<T>("Name");
R>


Да, пробовал уже, но заводить для каждого из полей структуры свой typedef — не самый лучший способ, на мой взгляд.
Re: boost::property_tree и decltype
От: Nikita.Trophimov  
Дата: 10.04.13 14:36
Оценка:
Проблемы возникают тогда, когда пытаешься использовать decltype для поля конкретного объекта какого-либо класса в качестве аргумента шаблонной функции-члена.

struct Foo
{
    int bar;
};

class Bar
{
public:
    template <typename T>
    void foo() {}
};

int main()
{
    Foo first;
    Bar second;

    second.foo<decltype(Foo::bar)>(); // Ok

    typedef decltype(first.bar) type;
    second.foo<type>(); // Ok

    // second.foo<decltype(first.bar)>(); // Error
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.