#include <iostream>
using namespace std;
template<typename T>
void test() {
cout << "1";
}
template<>
void test<std::string>() {
cout << "2";
}
int main() {
test<std::string()>(); //expected output 2 but actual output 1
}
为什么输出1而不是2?
答案 0 :(得分:9)
test<std::string>
(注意:最后没有括号)会产生你期望的结果。
将其写为test<std::string()>
实例化模板,其类型为“函数不带参数并返回std :: string”
答案 1 :(得分:2)
你的意思是调用像test<std::string>()
这样的函数吗?
在test<std::string()>()
中,模板参数不是std::string
,而是函数类型(不带参数且返回std::string
的函数)。
答案 2 :(得分:0)
std::string()
是typeid。 typeid是一个缺少声明者id的简单声明。
在template-argument中,如果type-id和表达式之间存在歧义,则将调用解析为type-id。所以你的代码输出1
您需要删除括号()
才能获得2作为输出,foo<std::string>()
将为您提供输出2.