在模板函数中键入错误

Raf*_*ini 2 c++ templates compiler-errors

可能是我在恶劣的C++书籍中学习的另一个愚蠢的问题(我打算纠正这个问题).

我正在使用sstream并尝试以下功能:

template <class num> num fromString(const std::string& str) {
  std::istringstream ss(str);
  num temp;
  ss >> temp;
  return temp;
}
Run Code Online (Sandbox Code Playgroud)

当我称之为:

int i = fromString<int>("123");
Run Code Online (Sandbox Code Playgroud)

它工作正常.但如果我称之为:

int i = fromString("123");
Run Code Online (Sandbox Code Playgroud)

我收到了一个编译错误:

error: no matching function for call to ‘fromString(std::string&)’
Run Code Online (Sandbox Code Playgroud)

我认为编译器会理解,如果我将值赋给a,int那么我必须谈论fromString<int>,但似乎并非如此.

我错过了什么吗?我应该总是指定模板化函数的类型吗?或者只是模板类型是返回类型?或者只是当模板类型无法通过输入类型确定时?

Joh*_*ing 9

不,编译器不能单独从返回类型推断模板参数.你必须像你原来一样具体:

int i = fromString<int>("123");
Run Code Online (Sandbox Code Playgroud)

编译器在这种情况下无法推断的原因之一是因为许多类型都可以转换为int.例如:

class Gizmo
{
public:
  operator int() const;
};
Run Code Online (Sandbox Code Playgroud)

fromString<Gizmo>()在这种情况下,编译器如何知道不实例化?