Вызов шаблона: фактическая специализация не называется - PullRequest
5 голосов
/ 20 мая 2011
#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 ]

9 голосов
/ 20 мая 2011

test<std::string> (примечание: без скобок в конце) даст то, что вы ожидаете.

Запись в виде test<std::string()> создает шаблон с типом "функция не принимает аргументов и возвращает std :: string"

2 голосов
/ 20 мая 2011

Вы имели в виду вызывать функцию как: test<std::string>()?

В вашем test<std::string()>() параметром шаблона является не std::string, а тип функции (функция, не имеющая аргументов и возвращающая std::string).

0 голосов
/ 20 мая 2011

std::string() - это typeid . Typeid - это простое объявление с отсутствующим идентификатором объявления.

В аргументе шаблона, если существует неопределенность между идентификатором типа и выражением, вызов разрешается в идентификаторе типа. Итак, ваш код выводит 1

Вам нужно убрать скобки (), чтобы получить 2 в качестве вывода, т. Е. foo<std::string>() даст вам вывод 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...