Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

initialisation d'un membre-class static d'une class, avec des templates partout

11 réponses
Avatar
AG
Bonjour,

je n'arrive pas à compiler cela :


template<class T> class I
{
T var;
};

template<class T, class V> class A
{
public:
static I<T> myI;
};

I<int> A<int,double>::myI; // ligne 13

int main(void)
{
A<int,double> myA;
return 0;
}

$ g++ test.cpp
test.cpp:13: error: too few template-parameter-lists

AG.

10 réponses

1 2
Avatar
AG
I<int> A<int,double>::myI; // ligne 13
template<> I<int> A<int,double>::myI;


c'est une spécialisation.... off course.

AG.

Avatar
AG
pfff.. je croyais m'en tirer, et en fait non :

test.h
------------------8<-----------------------
template<class T> class I
{
public:
T var;
};

template<class T, class V> class A
{
public:
static I<T> myI;
};
------------------8<------------------------

test.cpp
------------------8<------------------------
#include "test.h"

template<>
I<int> A<int,double>::myI;
------------------8<------------------------

main.cpp
------------------8<------------------------
#include "test.h"


int main(void)
{
A<int,double> myA;
I<int> ii = A<int,double>::myI;
return 0;
}
-------------------8<------------------------

et là, ça bloque à l'édition de liens :
$ make test
g++ -c main.cpp
g++ -c test.cpp
g++ -o test main.o test.o
main.o:main.cpp:(.text+0x2b): undefined reference to `A<int, double>::myI'
collect2: ld returned 1 exit status
make: *** [test] Error 1

j'utilise gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
sous cygwin.

J'ai essayé de rajouter la déclaration de variable myI à plusieurs endroits,
mais sans succes. J'aurais besoin d'aide...

Merci

AG.
Avatar
Fabien LE LEZ
On Fri, 3 Aug 2007 17:39:21 +0200, "AG" :

template<class T, class V> class A
{
public:
static I<T> myI;


Ici, tu déclares une variable membre statique.

};

I<int> A<int,double>::myI; // ligne 13


Pourquoi diable ne l'instancies-tu pas avec les mêmes paramètres ?

template <class T, class V> I<T> A<T,V>::myI;

Avatar
AG
Pourquoi diable ne l'instancies-tu pas avec les mêmes paramètres ?

template <class T, class V> I<T> A<T,V>::myI;


Certes, merci Fabien de me montrer qu'il est aussi possible de l'instancier
avec le template. C'est plus clair.
[Cela dit, je ne sais pas si tu as vu mon troisième post, mais cette
instanciation ne change pas mon problème de compilation unit.]

Alexandre.

Avatar
Michael DOUBEZ
pfff.. je croyais m'en tirer, et en fait non :

test.h
------------------8<-----------------------
template<class T> class I
{
public:
T var;
};

template<class T, class V> class A
{
public:
static I<T> myI;
};


//instanciation de la static de class
template<class T, class V>
I<T> A<T,V>::myI;


------------------8<------------------------


test.cpp
------------------8<------------------------
#include "test.h"

template<>
I<int> A<int,double>::myI;


Je ne crois pas que ça instancie la statique. Essaye de l'affecter.
template<>
I<int> A<int,double>::myI=0;

------------------8<------------------------

main.cpp
------------------8<------------------------
#include "test.h"


int main(void)
{
A<int,double> myA;
I<int> ii = A<int,double>::myI;
return 0;
}
-------------------8<------------------------

et là, ça bloque à l'édition de liens :
$ make test
g++ -c main.cpp
g++ -c test.cpp
g++ -o test main.o test.o
main.o:main.cpp:(.text+0x2b): undefined reference to `A<int, double>::myI'
collect2: ld returned 1 exit status
make: *** [test] Error 1

j'utilise gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
sous cygwin.

J'ai essayé de rajouter la déclaration de variable myI à plusieurs endroits,
mais sans succes. J'aurais besoin d'aide...

Merci

AG.




Avatar
AG
//instanciation de la static de class
template<class T, class V>
I<T> A<T,V>::myI;
ok, comme me l'a fait remarqué Fabien. Mais ne résoud pas le problème, comme

indiqué dans ma réponse à Fabien.

template<>
I<int> A<int,double>::myI;


Je ne crois pas que ça instancie la statique. Essaye de l'affecter.
Visiblement, le problème vient de là puisqu'il est partiellement résolu (cf

la suite). Pourquoi cette forme d'instanciation ne fonctionne-t-elle pas
pour les statiques reste un mystère pour moi.

template<>
I<int> A<int,double>::myI=0;
Après adapatation à mon code, la ligne suivante fait l'affaire :


I<int> A<int,double>::myI=I<int>();

par contre,

template<class T,class V> I<T> A<T,V>::myI=I<T>();

ne résoud pas mon problème. Pourquoi ?

AG


Avatar
Fabien LE LEZ
On Mon, 6 Aug 2007 11:15:48 +0200, "AG" :

Cela dit, je ne sais pas si tu as vu mon troisième post,


Troisième suivant quel ordre ?
Redonne le code corrigé.

Avatar
Michael DOUBEZ
Après adapatation à mon code, la ligne suivante fait l'affaire :

I<int> A<int,double>::myI=I<int>();

par contre,

template<class T,class V> I<T> A<T,V>::myI=I<T>();

ne résoud pas mon problème. Pourquoi ?


Le programme suivant compile très bien sur gcc3.4:
//test.hpp
//------------------8<-----------------------
template<class T> class I
{
public:
I(){}
I(const T& t):var(t){}

T var;
};

template<class T, class V> class A
{
public:
static I<T> myI;
};

template<class T, class V>
I<T> A<T,V>::myI=I<T>();
//------------------8<-----------------------

//main.cpp
//------------------8<-----------------------
#include "test.hpp"

int main(void)
{
A<int,double> myA;
I<int> ii = A<int,double>::myI;
return 0;
}
//------------------8<-----------------------

Michael

Avatar
Fabien LE LEZ
On Mon, 6 Aug 2007 11:15:48 +0200, "AG" :

[Cela dit, je ne sais pas si tu as vu mon troisième post, mais cette
instanciation ne change pas mon problème de compilation unit.]


Dans test.cpp, essaie de rajouter :

static void DUMMY()
{
static A<int,double> dummy;
}

Accessoirement, essaie avec la dernière version de g++. La branche 3.x
me semble passablement vieille.

Avatar
AG
Le programme suivant compile très bien sur gcc3.4:
Michael


Certes, mais il n'y a qu'une unité de compilation dans ce code, alors que
j'en ai deux. Chez moi aussi ça marche.

AG.

1 2