C++ 如何解决使用std::string和std::vector的构造函数之间的歧义

C++ 如何解决使用std::string和std::vector的构造函数之间的歧义,c++,overloading,ambiguous-call,C++,Overloading,Ambiguous Call,我想创建一个标记类,可以将其名称指定为点分隔的名称,如this.is.my.name或字符串向量,如{this,is,my,name} 当我尝试这样做时,编译器有时会告诉我,我的调用是不明确的。我想知道1为什么这是模棱两可的,2为什么只是有时候模棱两可 这是我的示例代码,您也可以查看和编译 使用指示的行,我得到以下错误: g++ -std=c++11 -O2 -Wall -pthread main.cpp && ./a.out main.cpp: In function 'int

我想创建一个标记类,可以将其名称指定为点分隔的名称,如this.is.my.name或字符串向量,如{this,is,my,name}

当我尝试这样做时,编译器有时会告诉我,我的调用是不明确的。我想知道1为什么这是模棱两可的,2为什么只是有时候模棱两可

这是我的示例代码,您也可以查看和编译

使用指示的行,我得到以下错误:

g++ -std=c++11 -O2 -Wall -pthread main.cpp && ./a.out
main.cpp: In function 'int main(int, char**)':
main.cpp:28:39: error: call of overloaded 'Tag(<brace-enclosed initializer list>)' is ambiguous
     Tag imaTagAlso{{"dotted","string"}};
                                   ^
main.cpp:18:1: note: candidate:     'Tag::Tag(std::vector<std::__cxx11::basic_string<char> >)'
 Tag::Tag(std::vector<std::string> name)
 ^~~
main.cpp:13:1: note: candidate: 'Tag::Tag(std::__cxx11::string)'
 Tag::Tag(std::string name)
 ^~~
标记imatagalways{{点,字符串}};说构造一个标记,也叫它imatag,并用{点,字符串}初始化它。问题是std::string可以由一对迭代器构造,而且由于字符串文本可以衰减为const char*,因此它们符合迭代器的条件。因此,您可以使用迭代器调用字符串构造函数,也可以使用其std::initializer\u list构造函数调用向量构造函数。要解决这个问题,您可以使用

Tag imaTagAlso{{{"dotted"},{"string"}}};
它说构造一个标记,也叫它imatag,并用{{dotterd},{string}}初始化它,现在{dotterd}和{string}成为向量构造函数的std::initializer_列表的元素

由于c++14使用了


这使得带大括号的init list std::string中的每个元素都是std::string,并且将选择向量构造函数。

或者可能只是在那里放置一个合适的类型-可能比3个花括号更简单。@SergeyA好主意。我添加了一种使用std::string运算符sYep的方法,非常棒。可能只是在向量构造函数之后,在您还可以使用之前的一个换行符?@SergeyA Updated。在C++11中,您可以显式地使用std::string:Tag-Imatagal{{{std::StringDotterd,std::stringstring};
Tag imaTagAlso{{{"dotted"},{"string"}}};
Tag imaTagAlso{{"dotted"s,"string"s}};