2016-12-15 54 views
0

我寫我自己的模板函數模板的參數問題:關於C++

[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] 
當我參數類型更改爲常量

template <typename T, size_t N> T* begin(const T (&arr)[N]) 
{ 
    return arr; 
} 

程序正常運行。它是如何發生的? 但是當我再次使用字符數組來調用它,報告新的錯誤:

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

那麼,問題來了,我怎麼能解決這個問題? 謝謝。

+1

當你的代碼被使用時,你有'use namespace std;'的地方嗎? –

+0

@πάνταῥεῖ我用std :: cout;使用std :: endl;使用std :: string;在你回覆之前。在將聲明更改爲使用namespace std後;問題已經解決了。有什麼關係? –

+0

有'std :: begin'標準函數。你想刪除'使用命名空間標準',這是一個壞主意。閱讀錯誤信息到最後,你會看到第二個功能在哪裏。 –

回答

1

您不能擁有此功能,因爲它具有與std::begin過載之一相同的名稱和簽名。幸運的是,它也完全一樣,所以你可以用std::begin代替。

如果由於某種原因需要使用你的函數,你必須給它一個不同的名字,或者把它放在你自己的名字空間中。

請注意,using namespace std不是因爲ADL需要找到std::begin

+0

感謝您對ADL的解釋,我已經更正了我的代碼。我將來會注意到這個問題。 –