Шаблон сомнений в C ++ - PullRequest
       0

Шаблон сомнений в C ++

7 голосов
/ 25 сентября 2010
#include <iostream>
using namespace std;
template<typename T> void test()
{
     cout << "Called from template T";
}
template<int I> void test()
{
     cout << "Called from int";
}
int main()
{
     test<int()>();      
}

В приведенном фрагменте test<int()>() вызывает первую версию и выдает

Called from template T

Почему не вызывается вторая версия?

Ответы [ 4 ]

11 голосов
/ 25 сентября 2010

Согласно ISO C ++ 03 (Section 14.3/2)

В аргументе-шаблоне неоднозначность между type-id и выражением разрешается в type-id.int() - это type-id, поэтому вызывается первая версия.

9 голосов
/ 25 сентября 2010

Попробуйте:

test<(int())>();
5 голосов
/ 25 сентября 2010

Мне не совсем понятно, чего вы пытаетесь достичь с этим. Но если вы хотите использовать другую специализацию шаблона при создании экземпляра шаблона с типом int, а не с любым другим типом, то это синтаксис, который вам нужен -

  #include <iostream>

  using namespace std;

  template<typename T> void test()
  {
       cout << "Called from template T";
  }

  template<> void test<int>()
  {
       cout << "Called from int";
  }


  int main()
  {
          test<int>(); 

  }
1 голос
/ 25 сентября 2010

Я думаю, вы хотели, чтобы второй шаблон вызывался всякий раз, когда T равен int. Джон показал вам , как это сделать, и Бенуа показал вам , что вам нужно сделать, чтобы фактически вызвать вторую функцию.

Ваша проблема в том, что, пытаясь специализировать test<>() для определенного типа (int), используя совершенно неверный синтаксис, вы случайно наткнулись на другой действительныйсинтаксическая форма .(Вид неудачи.) Во втором шаблоне функции используется так называемый параметр нетипичного шаблона .Для других типов вы можете использовать другие вещи в качестве параметров шаблона.Среди прочего (функции, шаблоны) вы также можете использовать интегральные константы, такие как int.Если бы вы попытались сделать это, скажем, с double, код не скомпилировался бы.
Ваш второй test<>() шаблон - это перегрузка первого, который можно использовать с константойцелые числа.Вот почему Бенуа test<0>() скомпилирует.

Для полной специализации (нет частичной специализации для шаблонов функций, есть только перегрузка; у шаблонов классов, однако, есть частичная специализация), вы должны всегда предоставлять пустой параметр шаблонаПеречислите (template<>) и поместите типы, на которые нужно специализироваться, за идентификатором test<int>.

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