关于C ++中模板参数的问题

时间:2016-12-15 15:07:36

标签: c++ arrays templates

我已经编写了自己的模板函数:

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]

所以,问题来了,我该如何解决? 谢谢。

1 个答案:

答案 0 :(得分:1)

您不能拥有此功能,因为它具有与std::begin重载之一相同的名称和签名。幸运的是,它也完全相同,所以你可以改用std::begin

如果由于某种原因你需要使用你的函数,你必须给它一个不同的名字,或者把它放在你自己的名称空间中。

注意,由于ADL,using namespace std <{1}}是必需的