Свёл код до минимального примера:
#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");
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, 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");
R>Очень странный баг, словно каким-то образом он пытается использовать instance в качестве this вместо pt.
R>Обойти еще вот так можно:
R>R>typedef decltype(instance.bar) T;
R>pt.get<T>("Name");
R>
Да, пробовал уже, но заводить для каждого из полей структуры свой typedef — не самый лучший способ, на мой взгляд.
Проблемы возникают тогда, когда пытаешься использовать 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
}