Шаблоны Variadic и копирование конструкции через назначение - PullRequest
0 голосов
/ 20 января 2011

Рассмотрим этот минимальный пример:

template <typename T, typename U>
struct foo {};

template <template <typename...> class Bar>
struct converter
{
     template <typename... Args>
     converter(const Bar<Args...> &);
};

int main()
{
    converter<foo> c(foo<int,double>()); // This works.
    // converter<foo> c = foo<int,double>(); This fails
}

Закомментированная строка завершается с GCC 4.5 и 4.6 с сообщением типа:

main.cpp:10:2: error: wrong number of template arguments (1, should be 2)
main.cpp:4:8: error: provided for template<class T, class U> struct foo
main.cpp: In function int main():
main.cpp:15:37: error: conversion from foo<int, double> to non-scalar type converter<foo> requested

Если вместо использования шаблонов с переменными параметрами используется определенное количество параметров шаблона (то есть, в данном случае 2), ошибок нет. Я немного сбит с толку, поскольку ожидал, что две строки будут в точности эквивалентны: это ожидаемое поведение?

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Да, это должно работать.Это ошибка GCC.GCC пока не поддерживает C ++ 0x вариационные шаблоны в полной мере (и, честно говоря, спецификация по-прежнему постоянно меняется в деталях).

То, что вы говорите «Это работает», действительно объявляет функцию;он не инициализирует объект, который был тем, что вы намеревались.

Для того, что вы намеревались, см. 14.3.3p3, который описывает, как template<typename...> class Bar может соответствовать foo, и 14.8.2.5p9, который описывает, как foo<Args...> может соответствовать foo<int, double>.

1 голос
/ 24 января 2011
template <typename T, typename U>
struct foo {};


struct converter
{
 template <template <typename...> class Bar, class ...Args>
     converter(const Bar<Args...> &){}
};

int main()
{
    converter c1((foo<int,double>())); // This works.
    converter c2 = foo<int,double>();// This works
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...