2015-10-14 7 views
2

компилируется и работает отлично:Вывод кода шаблона C++ - Что я делаю неправильно в этом примере?

template<typename T, typename ... Args> 
void func() 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    func<Args...>(); 
} 

int main() 
{ 
    func<int, char, float>(); 
    return 0; 
} 

... и это также собирает и работает нормально:

struct Object {}; // Some dummy object 

template<typename T, typename ... Args> 
void func(Object *a) 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    func<Args...>(a); 
} 

int main() 
{ 
    Object *a = new Object; 
    func<int, char, float>(a); 
    return 0; 
} 

... но это не компилируется, потому что он не может разрешить T:

struct Object {}; // Some dummy object 

template<typename T, typename ... Args> 
void func(Object *a, Object *b) 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    func<Args...>(a, b); 
} 

int main() 
{ 
    Object *a = new Object; 
    Object *b = new Object; 
    func<int, char, float>(a, b); 
    return 0; 
} 

Что я здесь делаю неправильно? Извините за невозможность надеть Ideone, заблокированный с работы.

+2

Ни один из этих примеров не компилировать на coliru: http://coliru.stacked-crooked.com/a/ea051afe36f710d1 – NathanOliver

+0

Странно ... Я согласен w с вами, но я использую Clang 3.7 на моем ноутбуке OS X, и он компилируется отлично. Странный. – user5406764

ответ

1

Как указано @NathanOliver, ваш код не компилируется ни с помощью clang, ни с помощью gcc.

следующие функции получить экземпляр:

func<int, char, float>() 
func<char, float>() 
func<float>() 

Теперь пакет параметр пуст, и компилятор пытается создать экземпляр func<>, что приводит к ошибке, что аргумент шаблона T не могут быть выведены.

Для того, чтобы закончить рекурсию правильно, вы можете использовать один из ответов this SO question, например:

#include <iostream> 

template <typename Last> 
void func() 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

template<typename First, typename Second, typename ... Args> 
void func() 
{ 
    std::cout << __PRETTY_FUNCTION__ << std::endl; 
    func<Second, Args...>(); 
} 

int main() 
{ 
    func<int, char, float>(); 
    return 0; 
} 

live example

выход

void func() [First = int, Second = char, Args = <float>] 
void func() [First = char, Second = float, Args = <>] 
void func() [Last = float]