Naw*_*waz 5 c++ gcc templates function-templates
以下代码编译正常:
template<typename T>
void f(const T &item) { return; }
int main()
{
f("const string literal");
}
Run Code Online (Sandbox Code Playgroud)
汇编在ideone上成功:http://ideone.com/dR6iZ
但是当我提到返回类型时,它不会编译:
template<typename T>
T f(const T &item) { return item; }
int main()
{
f("const string literal");
}
Run Code Online (Sandbox Code Playgroud)
现在它给出了错误:
prog.cpp:6:错误:没有匹配函数来调用'f(const char [21])'
代码:ideone:http://ideone.com/b9aSb
即使我创建了返回类型const T,它也不会编译.
我的问题是:
Eri*_*rik 14
您无法从函数返回数组,因此模板实例化失败,并且没有匹配的函数.
由于SFINAE,你得到这个特殊的错误- 编译器无法实例化你的函数并不是一个错误,这是一个没有匹配函数的错误.
您可以返回对数组的引用 - 返回T const &将起作用.
编辑:回应评论:
首先,这实际上是SFINAE的一个很好的例子.
template<typename T> T f(const T &item) { return item; }
char const * f(void const * item) { return 0; }
int main() {
f("abc");
}
Run Code Online (Sandbox Code Playgroud)
当编译器编译它时,它将首先尝试实例化模板化的f,以创建该类型的精确匹配const char [3].由于上述原因,这失败了.然后它将选择不精确的匹配,普通函数,并在调用中衰减const char [3]到a const char *.