шаблон шаблона класса с параметром шаблона const - PullRequest
8 голосов
/ 14 мая 2011

Я не понимаю, почему это не компилируется:

struct  A
{};  

template<class T> 
struct  B
{};  

template<template<class> class T1, class T2> 
struct C
{};

int
main  (int ac, char **av)
{
  typedef B<double> b;              //compiles
  typedef B<const double> b_const;  //compiles
  typedef B<A> ba;                  //compiles
  typedef B<const A> ba_const;      //compiles

  typedef C<B,double> c1;           //compiles
  typedef C<B,const double> c2;     //compiles
  typedef C<const B,double> c3;     //ISO C++ forbids declaration of ‘type name’ with no type
}

(я нахожу ссылку на стандарт немного загадочной)

Что мне нужно изменить, чтобы он компилировался?

EDIT:

Сведения о компиляторе (похоже, что это подходит):

Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 

EDIT2:

С помощью объяснения я пытаюсь сделать что-то вроде этого:

template<template<class> class TheContainer, class T> 
struct Iterator

template<class T> 
struct  Container

typedef Iterator<Container, double> iterator;
typedef Iterator<const Container, double> const_iterator;

Техника для не шаблонных контейнеров находится в конце этого документа: http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/iterator_facade.html

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

Ответы [ 4 ]

4 голосов
/ 14 мая 2011

Первый аргумент C не является типом, поэтому нет смысла передавать константный тип как его аргумент. Шаблон не может быть константным или неконстантным, только типы могут быть константными или неконстантными. Что означает const B?

const int имеет смысл. const vector<int> имеет смысл, как и vector<const int>. Но что бы const vector значило?

(Предупреждение о щепотке соли: я даже не знал о шаблонах-шаблонах до того, как увидел этот вопрос.)

Чтобы сделать это более конкретным, представьте, что B и C:

template<class T>
struct  B
{
        T t;
};      

template<template<class> class T1, class T2>
struct C
{
        T2 t2;
        T1<T2> t1;
};

c2 будет иметь тип

C<B,const double>   
==>   struct { const double t2; T1<const double> t1;}
==> struct { const double t2; struct { const double b; } t1;}

Что вы ожидаете от c3? Что t1 само по себе будет const, а t1.b не является const? Я полагаю, это имеет смысл.

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

Этот точный код компилируется в VS2010. Я не знаю вашего компилятора, но я предлагаю вам проверить в базе данных ошибок разработчика компилятора, если такая ошибка не зарегистрирована.

попробую в GCC см.


ОК. GCC (4.5.1) выдает ошибку. Думаю, нам придется подождать, пока кто-то со стандартными знаниями знает, стандартное ли это поведение или ошибка.


CLang (2.8) выдает ту же ошибку (с точно таким же сообщением).

1 голос
/ 14 мая 2011

Я держу пари, что MSVC молча проглатывает const так же, как const class es .

1 голос
/ 14 мая 2011

Я думаю, что B не может быть const, потому что в настоящее время он не имеет реального типа, и компилятор не знает, что должно быть const.Я не могу придумать решение для правильной компиляции, кроме как оставить константу прочь, так как шаблоны на самом деле причиняют боль мозгу.

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