Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;对重载模板func的调用不明确。编译器不';不要拆开原型和定义_C++_Templates_Compiler Errors_Ambiguous - Fatal编程技术网

C++ C++;对重载模板func的调用不明确。编译器不';不要拆开原型和定义

C++ C++;对重载模板func的调用不明确。编译器不';不要拆开原型和定义,c++,templates,compiler-errors,ambiguous,C++,Templates,Compiler Errors,Ambiguous,这真是一个可笑的编译错误。 我只是声明一个函数模板原型,然后定义它。 并没有错误,它的声明和定义都有相同的签名,但编译器将它们视为两个不同的函数模板 编译器:g++(Ubuntu 8.1.0-5ubuntu1~16.04)8.1.0 代码: #包括 #包括 //声明 模板 自动预结束字符串(t字符串和字符串,常量TChar*const和cString) ->std::如果启用,则启用; //定义 模板 自动预结束字符串(t字符串和字符串,常量TChar*const和cString) ->std:

这真是一个可笑的编译错误。 我只是声明一个函数模板原型,然后定义它。 并没有错误,它的声明和定义都有相同的签名,但编译器将它们视为两个不同的函数模板

编译器:
g++(Ubuntu 8.1.0-5ubuntu1~16.04)8.1.0

代码:

#包括
#包括
//声明
模板
自动预结束字符串(t字符串和字符串,常量TChar*const和cString)
->std::如果启用,则启用;
//定义
模板
自动预结束字符串(t字符串和字符串,常量TChar*const和cString)
->std::如果启用,则启用{
string.insert(0,cString);
返回字符串;
}
int main(){
std::wstring-wideOne;
常量wchar_t*wideCString=L“宽文本”;
prependToString(wideOne,wideCString);//歧义投诉
返回0;
}
编译输出:

tegeran@Vitaha:~/studing/tests/cpp_test$ g++ main.cpp -std=gnu++2a
main.cpp: In function ‘int main()’:
main.cpp:20:41: error: call of overloaded ‘prependToString(std::__cxx11::wstring&, const wchar_t*&)’ is ambiguous
     prependToString(wideOne, wideCString);
                                         ^
main.cpp:5:6: note: candidate: ‘std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> prependToString(TString&, const TChar* const&) [with TString = std::__cxx11::basic_string<wchar_t>; TChar = wchar_t; std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> = std::__cxx11::basic_string<wchar_t>&]’
 auto prependToString(TString & string, const TChar * const & cString)
      ^~~~~~~~~~~~~~~
main.cpp:10:6: note: candidate: ‘std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> prependToString(TString&, const TChar* const&) [with TString = std::__cxx11::basic_string<wchar_t>; TChar = wchar_t; std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> = std::__cxx11::basic_string<wchar_t>&]’
 auto prependToString(TString & string, const TChar * const & cString)
      ^~~~~~~~~~~~~~~
tegeran@Vitaha:~/studing/tests/cpp_test$g++main.cpp-std=gnu++2a
main.cpp:在函数“int main()”中:
main.cpp:20:41:错误:重载的“prependToString(std::u cxx11::wstring&,const wchar_t*&)”的调用不明确
prependToString(wideOne,wideCString);
^
main.cpp:5:6:注意:候选:“std::enable_if_t prependToString(TString&,const TChar*const&)[带TString=std:::_cx11::basic_string;TChar=wchar_t;std::enable_if_t=std:_cx11::basic_string&]
自动预结束字符串(t字符串和字符串,常量TChar*const和cString)
^~~~~~~~~~~~~~~
main.cpp:10:6:注意:候选:“std::enable_if_t prependToString(TString&,const TChar*const&)[带TString=std:::_cx11::basic_string;TChar=wchar_t;std::enable_if_t=std:_cx11::basic_string&]
自动预结束字符串(t字符串和字符串,常量TChar*const和cString)
^~~~~~~~~~~~~~~
我的签名使用SFINAE,因为在我的实际代码中,这个函数有更多的重载,但它们似乎并没有造成问题。
更值得一提的是,编译器版本打印的是
ubuntu1~16.04
,但我当前的ubuntu版本是
18.04
,也许线索就在这里

奇怪的是,这可以用Clang 6.0.1编译。这是产生错误的最简单的代码形式吗?@r3musn0x这真的不奇怪。MSVC给出了一个几乎相同的错误,这很奇怪。@n.m.这不是正常情况吗;)?
tegeran@Vitaha:~/studing/tests/cpp_test$ g++ main.cpp -std=gnu++2a
main.cpp: In function ‘int main()’:
main.cpp:20:41: error: call of overloaded ‘prependToString(std::__cxx11::wstring&, const wchar_t*&)’ is ambiguous
     prependToString(wideOne, wideCString);
                                         ^
main.cpp:5:6: note: candidate: ‘std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> prependToString(TString&, const TChar* const&) [with TString = std::__cxx11::basic_string<wchar_t>; TChar = wchar_t; std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> = std::__cxx11::basic_string<wchar_t>&]’
 auto prependToString(TString & string, const TChar * const & cString)
      ^~~~~~~~~~~~~~~
main.cpp:10:6: note: candidate: ‘std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> prependToString(TString&, const TChar* const&) [with TString = std::__cxx11::basic_string<wchar_t>; TChar = wchar_t; std::enable_if_t<is_same_v<TChar, typename std::remove_reference<decltype (string[0])>::type>, TString&> = std::__cxx11::basic_string<wchar_t>&]’
 auto prependToString(TString & string, const TChar * const & cString)
      ^~~~~~~~~~~~~~~