Voici une test:
In file included from /usr/local/include/boost/iterator/iterator_categories.hpp:22:0, from /usr/local/include/boost/iterator/iterator_facade.hpp:14, from /usr/local/include/boost/range/iterator_range_core.hpp:27, from /usr/local/include/boost/lexical_cast.hpp:30, from main.cpp:2: /usr/local/include/boost/lexical_cast/detail/converter_lexical.hpp: In instantiation of 'struct boost::detail::deduce_target_char_impl<boost::detail::deduce_character_type_later<N::alarm_code_t> >': /usr/local/include/boost/lexical_cast/detail/converter_lexical.hpp:270:89: required from 'struct boost::detail::deduce_target_char<N::alarm_code_t>' /usr/local/include/boost/lexical_cast/detail/converter_lexical.hpp:404:92: required from 'struct boost::detail::lexical_cast_stream_traits<const char*, N::alarm_code_t>' /usr/local/include/boost/lexical_cast/detail/converter_lexical.hpp:465:15: required from 'struct boost::detail::lexical_converter_impl<N::alarm_code_t, const char*>' /usr/local/include/boost/lexical_cast/try_lexical_convert.hpp:174:44: required from 'bool boost::conversion::detail::try_lexical_convert(const Source&, Target&) [with Target = N::alarm_code_t; Source = char [5]]' /usr/local/include/boost/lexical_cast.hpp:42:60: required from 'Target boost::lexical_cast(const Source&) [with Target = N::alarm_code_t; Source = char [5]]' main.cpp:25:60: required from here /usr/local/include/boost/lexical_cast/detail/converter_lexical.hpp:243:13: error: static assertion failed: Target type is neither std::istream`able nor std::wistream`able BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_right_shift<std::basic_istream<wchar_t>, T >::value),
3 Réponses :
Depuis l'appel à règles de recherche p>
Comme indiqué dans la recherche, la recherche d'un nom dépendant utilisé dans un modèle est reportée jusqu'à ce que les arguments de modèle soient connus, à quelle heure P>
recherche non ADL examine les déclarations de fonction avec une liaison externe visible à partir du contexte de définition modèle em> p>
li>
ADL examine les déclarations de fonction avec une liaison externe visible à partir du contexte de définition modèle em> et du contexte d'instanciation de modèle em> p> p> p> p>
li>
ul>
(En d'autres termes, l'ajout d'une nouvelle déclaration de fonction après la définition de modèle ne le rend pas visible, sauf via ADL) ... Le but de ceci est que la règle est de vous aider à protéger contre les violations de l'ODR pour les instanciations de modèles. p>
blockQuote>
En d'autres termes, la recherche non-ADL n'est pas effectuée à partir du contexte d'instanciation modèle em>. p>
L'espace de noms global n'est pas pris en compte car aucun des arguments de l'appel n'a d'association avec l'espace de noms global. P>
Ces bizarreries de recherche sont documentées dans N1691 espaces de noms explicites . P> Opérateur >> Code> est fabriqué à partir de
Boost :: Lexical_cast <> Code> Modèle de fonction, le deuxième argument à
Opérateur >> Code> est un Nom en fonction : P>
opérateur >> (std :: istream & is, n :: alarm_code_t & code) code> n'est pas déclaré dans Namespace
n code>, donc ADL ne le trouve pas. P>
J'ai réécrit l'exemple un peu: maintenant Le message d'erreur est un bit de consus (car boost). Pour mon exemple, c'est: p> qui explique beaucoup. P> p> faux_opérateur code> pour
N :: AC code> n'est pas défini dans
FakeBoost code>, il n'est pas non plus défini dans
n code> (donc pas ADL), donc
faux_cast code> ne le trouvera pas. P>
"Autres surcharges de opérateur >> code> se trouvent car ils utilisent
à l'aide de namepace std; code> dans Boost." whoa, quoi?
@ T.c. Cela semble faux, je ne vois pas à l'aide de noms d'espace std code> dans le contexte qui appelle réellement
>> code>: GITUB.COM/BOOSTORG/LLEG/LLEG/LLEG/LLEG/BLOB/BOOST/100
@ T.c. J'ai supprimé la note - c'est vraiment utilisé dans d'autres contextes. Mais ils gèrent std code> - si vous mettez
faux_opérator code> dans
std code> (juste pour la science) Cela commence à fonctionner
@Dadam c'est parce qu'il sera trouvé par ADL sur le type std :: istream code> ou quoi que ce soit
@Tavianbarnes Droite, il y a Deux arguments i> disponibles pour ADL. Merci!
Une fois opérateur >> code> se trouve dans
boost namespace code>, il cesse de regarder dans les espaces de noms clos. Il, cependant, faire aussi une recherche d'ADL.
template<class T>
void do_foo( T t ) {
foo(t);
}
}
namespace B{
struct bar {};
}
void foo(B::bar) {
std::cout << "foobar!\n";
}
Même si Nomspace Boost boost code> contient zéro
opérateur >> code> s,
:: opérateur >> code> ne sera toujours pas trouvé par une recherche ordinaire non qualifiée parce que cela seulement considère le contexte de définition du modèle.
@ T.c. Si vous avez défini >> code> avant d'inclure l'en-tête, il serait trouvé. ;)
Problème de l'ADL standard de la tourbière?
@ T.c.: Hmm ... Autre
Opérateur >> Code> trouvé dans le pages de noms
N code> Par conséquent espace de noms global et ce particulier
opérateur >> code> non trouvé? Mais je n'ai pas un autre
opérateur >> code> dans
n code>. Ou tout, en fait. Je ne peux pas grok où l'adl vient à elle.
ADL s'engage à ce que votre
opérateur >> code> s second type de paramètre est
n :: alarm_code_t code>, donc
n code> est un espace de noms associé et sera recherché la définition de l'opérateur.
@Praetorian the
>> code> appelle dans
Espace de noms boost code>. Je pense que la question de Lrio est "pourquoi n'est-ce pas l'opérateur
>> code> dans
espace de noms :: code> aussi i> considéré quand
>> code > est invoqué dans
Espace de noms Boost code>? " Dire "il n'est pas trouvé par ADL" seulement répond à la moitié de la question: ADL n'est pas la seule recherche.