有关C 模板参数的问题

questions about parameter of template in C++

本文关键字:问题 参数 有关      更新时间:2023-10-16

我已经写了自己的模板功能:

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;
}

程序m通常进行。它是怎么发生的?但是,当我使用一系列字符再次调用它时,报告了一个新错误:

[Error] invalid conversion from 'const char*' to 'char*' [-fpermissive]

所以,我该如何修复它?谢谢。

您不能具有此功能,因为它具有与std::begin超载之一相同的名称和签名。幸运的是,它也可以做同样的事情,因此您可以使用std::begin

如果由于某种原因需要使用您的功能,则必须给它一个不同的名称,或将其放在自己的名称空间中。

注意,using namespace std不是为了找到std::begin所必需的,因为ADL。