以下代码编译良好:
template<typename T>
void f(const T &item) { return; }
int main()
{
f("const string literal");
}
编辑成功:ide http://ideone.com/dR6iZ
但是当我提到返回类型时,它不会编译:
template<typename T>
T f(const T &item) { return item; }
int main()
{
f("const string literal");
}
现在它给出了错误:
prog.cpp:6:错误:没有匹配函数来调用'f(const char [21])'
ideone上的代码:http://ideone.com/b9aSb
即使我将返回类型const T
设为doesn't compile。
我的问题是:
答案 0 :(得分: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");
}
当编译器编译它时,它将首先尝试实例化模板化的f,为类型const char [3]
创建完全匹配。由于上述原因,这失败了。然后它会选择不精确的匹配,普通函数,并在调用中将const char [3]
衰减为const char *
。
答案 1 :(得分:0)
看起来好像你告诉它你计划返回一个T,但实际上你返回一个const T&amp ;.也许可以尝试将声明更改为:
template<typename T>
const T& f(const T& item) { return item; }
或者可能将返回值更改为参数的解除引用版本:
template<typename T>
T f(const T& item) { return (*item); }