static_cast<the_template<int>*>(0)
- est-ce instancier the_template
type int
?
La raison de la demande est le suivant code d'erreur au temps de lien avec une référence non définie à l' check_error<char>(void*, long)
avec Clang et GCC 4.4.5, indiquant qu'il n'a pas d' instancier le modèle. MSVC et GCC 4.5.1 cependant compiler et lier correctement, conduisant à le croire qu'il n' instancier le modèle. Toutefois, si vous laissez le plâtre, MSVC et GCC (les deux 4.4.5 et 4.5.1) l'erreur check_error<char>
seulement (le comportement souhaité), tandis que Clang l'erreur sur les deux appels. Normalement je crois que Clang quand il s'agit de se conformer trucs, mais je me demande:
Le compilateur est correct et ce qui ne le standard de dire à ce sujet?
#include <type_traits>
template<class T>
void check_error(void*, long);
template<class T>
struct foo{
template<class U>
friend typename std::enable_if<
std::is_same<T,U>::value
>::type check_error(foo<T>*, int){}
};
template struct foo<int>;
int main()
{
check_error<int>(static_cast<foo<int>*>(0), 0);
check_error<char>(static_cast<foo<char>*>(0), 0);
}