From defde33544ed949e312a5116375e6b32f29b0840 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Sat, 6 Jun 2020 17:18:02 +0900 Subject: [PATCH] fix: avoid ambiguity in overload resolution Since both `std::string` and `std::filesystem::path` can be convertible from `const char &[N]` (like, `parse("file.toml")`), after adding `parse(std::filesystem::path)`, the overload resolution of `parse("file.toml")` becomes ambiguous. By adding `parse(...)` that exactly matches to `parse("file.toml")`, we can remove this ambiguity. --- toml/parser.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/toml/parser.hpp b/toml/parser.hpp index b2e4755..d919c16 100644 --- a/toml/parser.hpp +++ b/toml/parser.hpp @@ -2102,6 +2102,24 @@ basic_value parse(const std::string& fname) } #ifdef TOML11_HAS_STD_FILESYSTEM +// This function just forwards `parse("filename.toml")` to std::string version +// to avoid the ambiguity in overload resolution. +// +// Both std::string and std::filesystem::path are convertible from const char[]. +// Without this, both parse(std::string) and parse(std::filesystem::path) +// matches to parse("filename.toml"). This breaks the existing code. +// +// This function exactly matches to the invokation with string literal. +// So this function is preferred than others and the ambiguity disappears. +template class Table = std::unordered_map, + template class Array = std::vector, + std::size_t N> +basic_value parse(const char (&fname)[N]) +{ + return parse(std::string(fname)); +} + template class Table = std::unordered_map, template class Array = std::vector>