C++ 对专用模板函数的返回类型使用“自动”时出错

C++ 对专用模板函数的返回类型使用“自动”时出错,c++,c++11,template-specialization,auto,C++,C++11,Template Specialization,Auto,考虑以下代码段(从更复杂的代码中简化): #包括 #包括 结构A{ 模板 作废打印(){std::cout据编译器所知,在程序中还没有看到的某个地方存在一个专门化的foo,用于一些T,它返回的不是a。因此它不能假定res总是a。因此,res的类型实际上取决于模板e参数T,然后res.print毕竟是一个依赖名称 然后需要使用template关键字让编译器知道print之后的角括号将被解析为构成模板id一部分的角括号,而不是小于运算符 #include <typeinfo> #incl

考虑以下代码段(从更复杂的代码中简化):

#包括
#包括
结构A{
模板

作废打印(){std::cout据编译器所知,在程序中还没有看到的某个地方存在一个专门化的
foo
,用于一些
T
,它返回的不是
a
。因此它不能假定
res
总是
a
。因此,
res
的类型实际上取决于模板e参数
T
,然后
res.print
毕竟是一个依赖名称

然后需要使用
template
关键字让编译器知道
print
之后的角括号将被解析为构成模板id一部分的角括号,而不是小于运算符

#include <typeinfo>
#include <iostream>

struct A{
    template<int S>
    void print(){ std::cout << S << std::endl; }
};

struct B{};

template <class T>
A foo(int);

template<>
A foo<B>(int){ return A{}; }

template<class T>
int bar(int){
  auto res = foo<T>(0);
  std::cout << typeid(res).name() << std::endl;
  res.print<5>();       // This line gives an error
  return 0;
}

int main() {
  bar<B>(0);
  return 0;
}
main.cpp:21:16: error: expected primary-expression before ')' token
   21 |   res.print<5>();