Чего хочет gcc?

apl13

#include <vector>

template<typename A> int f {
     std::vector<A>::const_iterator i;
     return 0;
}

int main {
     return f<int>
}

$ g++ test.cc
test.cc: In function ‘int f’:
test.cc:4: error: expected `;' before ‘i’
test.cc: In function ‘int f [with A = int]’:
test.cc:9: instantiated from here
test.cc:4: error: dependent-name ‘std::vector::const_iterator’ is parsed as a non-type, but instantiation yields a type
test.cc:4: note: say ‘typename std::vector::const_iterator’ if a type is meant

C:\Program Files\Microsoft Visual Studio 8\VC>cl /EHsc "test.cc"
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.cc
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

Почему VC++ такую функцию проглатывает, а g++ нет, и чего нужно последнему? :crazy:

apl13

$ g++ -v
Using built-in specs.
Target: i686-pc-cygwin
Configured with: /gnu/gcc/releases/respins/4.3.4-3a/gcc4-4.3.4-3/src/gcc-4.3.4/configure --srcdir=/gnu/gcc/releases/respins/4.3.4-3a/gcc4-4.3.4-3/src/gcc-4.3.4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar
Thread model: posix
gcc version 4.3.4 20090804 (release) 1 (GCC)

Dasar

>а g++ нет, и чего нужно последнему? :crazy:
он же пишет
test.cc:4: note: say ‘typename std::vector::const_iterator’ if a type is meant
зы
gcc не хочет догадываться, что const_iterator есть алиас для типа, а не для функции или переменной, а хочет чтобы ты ему об этом явно сказал.

apl13

Ояебу! Спасибо.
Блин. Это потому что никогда нельзя заранее утверждать, что нет
namespace std {template<> struct vector<int> {int const_iterator;};}
? Специализация такая специализация. :crazy:

Dasar

>потому что никогда нельзя заранее утверждать, что нет
угу
Оставить комментарий
Имя или ник:
Комментарий: