4

我有一个模板类,我在其中定义了引用该模板类的自由函数。这些自由函数也以不同的参数为模板。

从课外我可以调用自由函数。但是,我找不到一个自由函数调用另一个函数的正确语法。

快速示例:

template<typename T> class Foo {
  template<typename S>
  friend S f(const Foo &) { return S(); }

  template<typename S>
  friend S g(const Foo &s) {
    return f(s);  // See below, when instantiated, yields 'no matching function for call to f(const Foo &)'
  }
};

float test1() {
  Foo<int> o;
  return f<float>(o); // Compiles
}

float test2() {
  Foo<int> o;
  return g<float>(o); // Fails to compile as line above errors
}

(也参考这个链接

似乎在 g() 中调用 f(s) 时,最外层的模板已经丢失。我如何在对 f 的调用中重新指定 T?我检查了 GCC4.7、4.8、clang 3.2 都有相同的错误。

4

1 回答 1

6

当您调用时,f(s)您需要指定模板参数S,因为它不能从参数中推导出来s

但是,如果您将其更改为f<S>(s)(假设您打算使用与调用相同的模板参数来调用它Sg,那么您将禁止 ADL,并且可以找到在类范围内定义的友元函数的唯一方法是通过 ADL。所以你需要f在全局命名空间中添加一个声明,以便调用g可以找到它。

因此,要使其正常工作,您需要先添加这些声明Foo

template<typename T> class Foo;

template<typename S, typename T>
  S f(const Foo<T> &);

template<typename S, typename T>
  S g(const Foo<T> &);

并将调用更改g为 bef<S>(s)或其他类似的东西f<x>(s)

于 2013-05-21T15:31:25.403 回答