2015-11-16 1 views
1

Je programme une matrice de gabarit avec multi-threading. je besoin de mon matrice pour pouvoir travailler avec cette ligne de code (que je ne peux pas changer, il est une demande de mon programme):Définition de la valeur C++ dans le fichier cpp et qualification supplémentaire

Matrix<Complex>::setParallel(false); 

donc pour ce parallèle (qui est un bool décide si d'utiliser multi enfilage ou non) doit être statique.

Ainsi, au début je l'ai défini comme:

template<class T> 
class Matrix 
{ 
private: 
... 
public: 
static bool parallel; 
... 
}; 

mais j'ai obtenu cette erreur:

... undefined reference to 'Matrix<int>::parallel' 

après une recherche rapide je suis arrivé à cette question dans un débordement de pile: Undefined reference to a static member

alors je vais de l'avant et à ce que les réponses ont dit. donc je changé mon code pour:

template<class T> 
    class Matrix 
    { 
    private: 
    ... 
    public: 
    static bool Matrix::paraller; 
    ... 
    }; 

et maintenant j'obtenir cette erreur:

extra qualification 'Matrix<T>::' on member 'paraller' [-fpermissive] 

(note: i aussi essayé statique "bool Matrice :: parallèle possible," à la place, n'a pas aidé .

maintenant je ne sais pas comment se débarrasser de l'erreur de qualification supplémentaire sans revenir la référence non définie à nouveau.

si cette matière, tout le code est un nom de fichier d: "Matrix.hpp", que je ne peux pas changer (une autre demande de mon projet).

que devrais-je faire?

+0

Voir http://stackoverflow.com/questions/12573816/what-is-an-defined-reference-unresolved-external-symbol-error-and-how-do-i-fix – juanchopanza

+0

Voir [Pourquoi les modèles seulement être implémenté dans le fichier d'en-tête?] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) s'il vous plait. –

+0

@juanchopanza Je ne vois nulle part dans ce fil où il couvre le cas de la variable statique dans un modèle de classe (ce qui n'est pas évident comment gérer) –

Répondre

1

L'usage correct des membres de la classe statique est décrite dans ce extrait de code

struct A 
{ 
    static bool concurrent; 
}; 

A::concurrent = false; 

ou, si le membre est const

struct B 
{ 
    static const bool concurrent = false; 
}; 

Spécification du membre de classe statique modèle est exactement le même. Et une chose ressort: initialisation de membre statique doit être disponible à la portée de la déclaration. Cela signifie, vous ne peut pas découpler la déclaration hors de la mise en œuvre - ils doivent être exactement dans le même programme. Néanmoins, ceci est l'exigence commune pour chaque unité de modèle, que ce soit un objet, une fonction, etc.

Ainsi, la création d'un membre de classe statique modèle non-const est réalisée de cette manière

template <typename T, typename U, typename... Rest> 
struct TemplateStruct 
{ 
    static U variable; 
} 

template <typename T, typename U, typename... Rest> 
TemplateStruct<T, U, Rest...>::variable = U(); 

U peut être n'importe quel type que vous voulez, alors qu'il a un default constructor.