I have types in my code that use typedef statements to specialize some of the standard container types. I get a "Multiple declarations" error for to_json when I attempt to convert one of these to json so I can output them into a results file.
typdef vector<float> State;
typdef vector<float> Offset;
and I use it inside of other types like
struct Node {
Offset offset;
State state;
float cost;
}
I tried defining a to_json instance for my Node type like so:
void to_json(json& j, const Node& n) {
j = json{{"cost", n.cost}, {"state", n.state}, {"offset", n.offset}};
}
but I get an extremely verbose error telling me I have multiple declarations of the to_json instance. It's similar to the error I would get when using the implicit conversion of n.state = j.at("state") without using get<vector<float>>().
I also tried explicitly copying the values to no avail.
void to_json(json& j, const Node& n) {
vector<float> state = n.state;
vector<float> offset = n.offset;
j = json{{"offset", offset}, {"state", n.state}};
}
The full error message is _really_ long but I can add it upon request.
I cannot reproduce the error. This code works (Clang):
#include "json.hpp"
using json = nlohmann::json;
typedef std::vector<float> State;
typedef std::vector<float> Offset;
struct Node {
Offset offset;
State state;
float cost;
};
void to_json(json& j, const Node& n) {
j = json{{"cost", n.cost}, {"state", n.state}, {"offset", n.offset}};
}
int main()
{
Node n;
n.offset = {1.1, 2.2, 3.3};
n.state = {4.4, 5.5};
n.cost = 47.11;
json j = n;
std::cout << std::setw(2) << j << std::endl;
}
Output:
{
"cost": 47.1100006103516,
"offset": [
1.10000002384186,
2.20000004768372,
3.29999995231628
],
"state": [
4.40000009536743,
5.5
]
}
Did you put the to_json implementation in a header file and not use the inline keyword?
@gregmarr that worked, thank you very much! Is there any reason in particular that I have to use an inline statement in header files?
Anyway, the error message has changed, I think I'm close to figuring it out now, I think it's just an issue with make not being able to find the definitions...
The reason for inline is that you're telling the compiler that you expect this definition to appear in multiple "translation units" and that it should eliminate all the extra definitions.
http://en.cppreference.com/w/cpp/language/inline
@gregmarr I've got everything working now, thank you so much!
Most helpful comment
The reason for
inlineis that you're telling the compiler that you expect this definition to appear in multiple "translation units" and that it should eliminate all the extra definitions.http://en.cppreference.com/w/cpp/language/inline