Betrachten Sie den folgenden Code ein:nicht-statische Daten Memberinitialisierungsliste mit neuem Ausdruck
#include <map>
template <typename T>
struct X {
std::map<int, T>* storage = new std::map<int, T>();
};
int main() {
X<int> x;
}
Dies kompiliert auf clang 3.6.0, aber nicht auf gcc 5.1 kompilieren. Es würde jedoch kompilieren, wenn der Typ storage
stattdessen std::vector<T>*
(oder nur T*
) wäre.
Ich bin ziemlich sicher, das ist ein Compiler Fehler auf gcc Teil (edit: ich es als 66344 vorgelegt), aber dachte, ich würde fragen, um sicher zu stellen: Gibt es einen Grund, das obige Beispiel soll nicht Kompilierung ?
gcc Compiler-Fehler:
main.cpp:5:51: error: expected ';' at end of member declaration
std::map<int, T>* storage = new std::map<int, T>();
^
main.cpp:5:51: error: declaration of 'std::map<int, T> X<T>::T'
main.cpp:3:11: error: shadows template parm 'class T'
template <typename T>
^
main.cpp:5:52: error: expected unqualified-id before '>' token
std::map<int, T>* storage = new std::map<int, T>();
^
main.cpp:5:46: error: wrong number of template arguments (1, should be at least 2)
std::map<int, T>* storage = new std::map<int, T>();
^
In file included from /usr/local/include/c++/5.1.0/map:61:0,
from main.cpp:1:
/usr/local/include/c++/5.1.0/bits/stl_map.h:96:11: note: provided for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
class map
^
Nur um sicher zu sein: Verwenden Sie 'gcc' oder' g ++ '? Das habe ich mal zu oft gemischt ... – atlaste
@atlaste g ++ 4.9.2 kompiliert das auch nicht. –
MSVC13 kompiliert es ohne Fehler. So scheint ein Fehler zu sein – Christophe