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>
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) –