对 ini 文件使用 property_tree 时出现问题
Issue when using property_tree for a ini file
使用 属性 树编译以写入和读取 ini(文本)文件时出现奇怪的错误。简单的独立程序 (MSVP) 工作正常。但是当我将它包含在我的主代码中时,我得到了这个错误。这意味着什么?
看来它对我不满意包括
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
当我将它们注释掉时,这个错误就消失了。
我的 LD_LIBS 中有 -lboost_system。 ptree 会属于 boost_system 库还是我应该包含的任何其他库?
In file included from /home/badri/usr/include/boost/property_tree/ptree.hpp:516,
from recorder_apis.h:15,
from recorder_apis.cpp:1:
/home/badri/usr/include/boost/property_tree/detail/ptree_implementation.hpp: In member function ‘boost::property_tree::basic_ptree<K, D, C>& boost::property_tree::basic_ptree<Key, Data, KeyCompare>::get_child(const path_type&)’:
/home/badri/usr/include/boost/property_tree/detail/ptree_implementation.hpp:571:58: error: declaration of ‘path’ shadows a global declaration [-Werror=shadow]
571 | basic_ptree<K, D, C>::get_child(const path_type &path)
| ~~~~~~~~~~~~~~~~~^~~~
In file included from /home/badri/usr/include/boost/property_tree/ptree.hpp:15,
from recorder_apis.h:15,
from recorder_apis.cpp:1:
/home/badri/usr/include/boost/property_tree/ptree_fwd.hpp:89:67: note: shadowed declaration is here
89 | typedef string_path<std::string, id_translator<std::string> > path;
| ^~~~
我只使用了 boost 库。所以我不直接处理文件 ptree_fwd.hpp 或 ptree_implementation.hpp。
MSVP 运行良好
#include<iostream>
#include<boost/property_tree/ptree.hpp>
#include<boost/property_tree/ini_parser.hpp>
using namespace std;
int main()
{
using boost::property_tree::ptree;
ptree pt;
std::string jobToken1="123";
std::string jobToken2="234";
std::string jobToken3="345";
pt.put("General.Token", "rec1");
pt.put("General.Location", "/media/sd1/abc_1");
pt.put(jobToken1+".startTime", 123456);
pt.put(jobToken1+".endTime", 345678);
pt.put(jobToken2+".startTime", 123456);
pt.put(jobToken2+".endTime", 345678);
pt.put(jobToken3+".startTime", 123456);
pt.put(jobToken3+".endTime", 345678);
write_ini("input.txt", pt);
read_ini("input.txt", pt);
for(auto& section : pt)
{
cout << "[" << section.first << "]\n";
for (auto& key: section.second)
cout << key.first << "=" << key.second.get_value<string>() <<"\n";
}
}
~
某些东西在周围范围内定义了 path
。错误消息告诉您:
ptree_implementation:57.hpp: In member function ‘basic_ptree<...>& basic_ptree<...>::get_child(const path_type& path)’:
error: declaration of ‘path’ shadows a global declaration [-Werror=shadow]
一个简单的复制是例如
namespace boost::property_tree {
int path() { return 0; }
}
#include <boost/property_tree/ptree.hpp>
什么给了?
奇怪的是,这个定义似乎没问题,并且在 ptree_fwd
的第 89 行对我来说也出现了,所以一定有其他事情正在进行。
可能存在一个罕见的编译器问题(只有当您的编译器很旧时才有可能)。否则,可能会有另一个预处理器问题干扰。通过查看预处理源(cmake -build test.cpp.i
或 g++ .... -E
)找出答案。如果您想让我查看它以了解问题,您可以将其上传到 pastebin 站点。
简化
没关系,这里是您的代码的简化版本:Live On Coliru
#include <boost/property_tree/ini_parser.hpp>
#include <iostream>
int main() {
using boost::property_tree::ptree;
ptree pt;
pt.put("General.Token", "rec1");
pt.put("General.Location", "/media/sd1/abc_1");
for (ptree::path_type p : {"123", "234", "345"}) {
pt.put(p / "startTime", 123456);
pt.put(p / "endTime", 345678);
}
write_ini(std::cout, pt);
}
版画
[General]
Token=rec1
Location=/media/sd1/abc_1
[123]
startTime=123456
endTime=345678
[234]
startTime=123456
endTime=345678
[345]
startTime=123456
endTime=345678
使用 属性 树编译以写入和读取 ini(文本)文件时出现奇怪的错误。简单的独立程序 (MSVP) 工作正常。但是当我将它包含在我的主代码中时,我得到了这个错误。这意味着什么?
看来它对我不满意包括
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
当我将它们注释掉时,这个错误就消失了。 我的 LD_LIBS 中有 -lboost_system。 ptree 会属于 boost_system 库还是我应该包含的任何其他库?
In file included from /home/badri/usr/include/boost/property_tree/ptree.hpp:516,
from recorder_apis.h:15,
from recorder_apis.cpp:1:
/home/badri/usr/include/boost/property_tree/detail/ptree_implementation.hpp: In member function ‘boost::property_tree::basic_ptree<K, D, C>& boost::property_tree::basic_ptree<Key, Data, KeyCompare>::get_child(const path_type&)’:
/home/badri/usr/include/boost/property_tree/detail/ptree_implementation.hpp:571:58: error: declaration of ‘path’ shadows a global declaration [-Werror=shadow]
571 | basic_ptree<K, D, C>::get_child(const path_type &path)
| ~~~~~~~~~~~~~~~~~^~~~
In file included from /home/badri/usr/include/boost/property_tree/ptree.hpp:15,
from recorder_apis.h:15,
from recorder_apis.cpp:1:
/home/badri/usr/include/boost/property_tree/ptree_fwd.hpp:89:67: note: shadowed declaration is here
89 | typedef string_path<std::string, id_translator<std::string> > path;
| ^~~~
我只使用了 boost 库。所以我不直接处理文件 ptree_fwd.hpp 或 ptree_implementation.hpp。
MSVP 运行良好
#include<iostream>
#include<boost/property_tree/ptree.hpp>
#include<boost/property_tree/ini_parser.hpp>
using namespace std;
int main()
{
using boost::property_tree::ptree;
ptree pt;
std::string jobToken1="123";
std::string jobToken2="234";
std::string jobToken3="345";
pt.put("General.Token", "rec1");
pt.put("General.Location", "/media/sd1/abc_1");
pt.put(jobToken1+".startTime", 123456);
pt.put(jobToken1+".endTime", 345678);
pt.put(jobToken2+".startTime", 123456);
pt.put(jobToken2+".endTime", 345678);
pt.put(jobToken3+".startTime", 123456);
pt.put(jobToken3+".endTime", 345678);
write_ini("input.txt", pt);
read_ini("input.txt", pt);
for(auto& section : pt)
{
cout << "[" << section.first << "]\n";
for (auto& key: section.second)
cout << key.first << "=" << key.second.get_value<string>() <<"\n";
}
}
~
某些东西在周围范围内定义了 path
。错误消息告诉您:
ptree_implementation:57.hpp: In member function ‘basic_ptree<...>& basic_ptree<...>::get_child(const path_type& path)’:
error: declaration of ‘path’ shadows a global declaration [-Werror=shadow]
一个简单的复制是例如
namespace boost::property_tree {
int path() { return 0; }
}
#include <boost/property_tree/ptree.hpp>
什么给了?
奇怪的是,这个定义似乎没问题,并且在 ptree_fwd
的第 89 行对我来说也出现了,所以一定有其他事情正在进行。
可能存在一个罕见的编译器问题(只有当您的编译器很旧时才有可能)。否则,可能会有另一个预处理器问题干扰。通过查看预处理源(cmake -build test.cpp.i
或 g++ .... -E
)找出答案。如果您想让我查看它以了解问题,您可以将其上传到 pastebin 站点。
简化
没关系,这里是您的代码的简化版本:Live On Coliru
#include <boost/property_tree/ini_parser.hpp>
#include <iostream>
int main() {
using boost::property_tree::ptree;
ptree pt;
pt.put("General.Token", "rec1");
pt.put("General.Location", "/media/sd1/abc_1");
for (ptree::path_type p : {"123", "234", "345"}) {
pt.put(p / "startTime", 123456);
pt.put(p / "endTime", 345678);
}
write_ini(std::cout, pt);
}
版画
[General]
Token=rec1
Location=/media/sd1/abc_1
[123]
startTime=123456
endTime=345678
[234]
startTime=123456
endTime=345678
[345]
startTime=123456
endTime=345678