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>();