模板调用:未调用实际专业化

时间:2011-05-20 17:51:54

标签: c++ string templates

#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?

3 个答案:

答案 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.