返回类型为T的函数模板无法编译

时间:2011-03-15 02:10:43

标签: c++ templates gcc function-templates

以下代码编译良好:

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

我的问题是:

  • 为什么不编译?
  • 返回类型与错误和函数模板实例化有什么关系?

2 个答案:

答案 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); }