2017-10-18 2 views
4

J'essaie d'utiliser la bibliothèque de différenciation automatique Adept et je l'ai fait fonctionner avec gcc 4.9.0 et icc 16.0.2 mais échoué avec VS 2017 et Clang 4.0.1erreur: aucun membre nommé 'rank_' dans 'EndIndex'

J'ai réduit le problème à l'extrait suivant et, pendant que j'aborde le problème avec les créateurs de bibliothèque, pour les besoins de la connaissance, je voudrais savoir pourquoi ce morceau de code fonctionne dans les deux compilateurs mentionnés et échoue construire dans les deux autres.

template <typename A> 
struct Expression 
{ 
    static const int rank = A::rank_; 
}; 

struct EndIndex : public Expression<EndIndex> 
{ 
    static const int rank_ = 0; 
}; 

int main(int argc, char ** argv) 
{ 
    return 0; 
} 

sortie pour VS 2017 est:

1>------ Build started: Project: Test, Configuration: Debug Win32 ------ 
1>Source.cpp 
1>d:\Test\source.cpp(4): error C2039: 'rank_': is not a member of 'EndIndex' 
1>d:\Test\source.cpp(7): note: see declaration of 'EndIndex' 
1>d:\Test\source.cpp(8): note: see reference to class template instantiation 'Expression<EndIndex>' being compiled 
1>d:\Test\source.cpp(4): error C2065: 'rank_': undeclared identifier 
1>d:\Test\source.cpp(4): error C2131: expression did not evaluate to a constant 
1>d:\Test\source.cpp(4): note: failure was caused by non-constant arguments or reference to a non-constant symbol 
1>d:\Test\source.cpp(4): note: see usage of 'rank_' 
1>Done building project "Test.vcxproj" -- FAILED. 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Et sortie pour Clang 4.0.1:

source.cpp:4:37: error: no member named 'rank_' in 'EndIndex' 
           static const int rank = A::rank_; 
                 ~~~^ 
source.cpp:7:38: note: in instantiation of template class 'Expression<EndIndex>' requested here 
                 struct EndIndex : public Expression<EndIndex> 
+0

J'arrive de trouver la réponse que je cherchais dans une autre question CRTP. [link] (https://stackoverflow.com/questions/46576847/clang-vs-gcc-crtp-constexpr-variable-cannot-have-non-literal-type/46578880#46578880) –

Répondre

3

Cela se produit probablement parce que rank_ n'est pas défini à ce stade.

Les correctifs suivants il pour la version d'Apple LLVM 9.0.0 (clang-900.0.38):

template <typename A> 
struct Expression 
{ 
    static const int rank; 
}; 

struct EndIndex : public Expression<EndIndex> 
{ 
    static const int rank_ = 0; 
}; 

template <typename A> 
const int Expression<A>::rank = A::rank_; 
+0

Cette suggestion résout le problème aussi dans VS 2017. –

+0

@ ManuelNúñez, merci de vérifier cela! –

0

Visual C++ et clang sont tout simplement incapables de trouver rank_ membre de EndIndex parce qu'il est être consulté avant déclaré. Un tel code fantaisie entraîne souvent des problèmes dans certains environnements.