我已经编写了自己的模板函数:
template <typename T, size_t N> T* begin(T (&arr)[N])
{
return arr;
}
当我使用一个字符串数组来调用它时:
string str[] = {"aaa", "bbb", "ccc"};
cout << *begin(str) << endl;
编译器将报告错误:
[Error] call of overloaded 'begin(std::__cxx11::string [3])' is ambiguous
[Note] candidate: T* begin(T (&)[N]) [with T = std::__cxx11::basic_string<char>; long long unsigned int N = 3ull]
当我将参数类型更改为const:
时template <typename T, size_t N> T* begin(const T (&arr)[N])
{
return arr;
}
程序正常运行。怎么会发生? 但是当我使用char数组再次调用它时,会报告一个新的错误:
[Error] invalid conversion from 'const char*' to 'char*' [-fpermissive]
所以,问题来了,我该如何解决? 谢谢。
答案 0 :(得分:1)
您不能拥有此功能,因为它具有与std::begin
重载之一相同的名称和签名。幸运的是,它也完全相同,所以你可以改用std::begin
。
如果由于某种原因你需要使用你的函数,你必须给它一个不同的名字,或者把它放在你自己的名称空间中。
注意,由于ADL,using namespace std
<{1}}是必需的 。