2016-05-30 5 views
2

Я пытаюсь создать шаблон для функции с несколькими параметрами, а затем псевдоним для конкретного экземпляра. От этого действительно хороший пост:псевдоним для шаблона функции нескольких параметров

C++11: How to alias a function?

Я нашел пример кода, который работает для одного параметра функции и одного параметра шаблона:

#include <iostream> 
namespace Bar 
{ 
    void test() 
    { 
     std::cout << "Test\n"; 
    } 

    template<typename T> 
    void test2(T const& a) 
    { 
     std::cout << "Test: " << a << std::endl; 
    } 
} 

void (&alias)()  = Bar::test; 
void (&a2)(int const&) = Bar::test2<int>; 

int main() 
{ 
    Bar::test(); 
    alias(); 
    a2(3); 
} 

Когда я пытаюсь расширить до двух параметров функции, как, например:

void noBarTest(T const& a, T const& b) 
{ 
    std::cout << "noBarTest: " << a << std::endl; 
} 

void(&hh)(int const&, int const&) = noBarTest<int, int>; 

я получаю эти ошибки в Visual Studio:

ошибка C2440: 'инициализации': не удается преобразовать из 'пустоты (__cdecl *) (сопзЬ T &, сопзЬ Т &)' в 'пустоте (__cdecl &) (Const INT &, Const INT &)'

IntelliSense: ссылка типа "пустот (&) (Const INT &, Const INT &)" (не Const квалифицированных) не может быть инициализирован со значением типа ""

Мне показалось, что я следовал за шаблоном, расширяя до 2 аргументов.
Каков правильный синтаксис для этого?

+0

Я не вижу функция noBarTest имеющий параметры шаблона ... шаблон . – Arunmu

+1

Поскольку это ваш первый вопрос, я предполагаю, что вы новичок в переполнении стека. Итак, Добро пожаловать! Используйте раздел комментариев, если у вас есть трудности с пониманием решений, предлагаемых другими. Если вы найдете рабочее решение, вы можете принять ответ, нажав кнопку «Проверить» под прилавком. Это поможет вам получить больше ответов в следующий раз, когда вы зададите вопрос. – Arunmu

+0

@Arunmu, Спасибо за приветствие. Я не был уверен, когда использовать комментарии, поэтому теперь я знаю. Вы правы, что я оставил объявление шаблона в фрагменте кода. Я был там, но потерял его в редактировании, когда я искал попытку форматирования. – Matt

ответ

1
template <typename T> 
void noBarTest(T const& a, T const& b) 
{ 
} 

void(&hh)(int const&, int const&) = noBarTest<int>; // Only once 

int main() { 
    return 0; 
} 

Параметр типа int должен быть указан только один раз в noBarTest<int>.

+0

Ничего себе, это была непродуманная ошибка. Спасибо, что указали! Является ли требование const или необходимостью или просто хорошей практикой? – Matt

+0

Для родственных типов, таких как char, int и т. Д. Это не имеет значения. Лучше переходите по значению. Для пользовательских типов, которые являются дорогостоящими для копирования, лучше передать ссылку на const, если вы не хотите, чтобы их изменяли на вызываемом сайте или по ссылке, если вы хотите обновить контент своего типа на вызываемом сайте. – Arunmu

+0

@Matt Вы найдете это сообщение интересным: http://stackoverflow.com/questions/410593/pass-by-reference-value-in-c – Arunmu

Смежные вопросы