En passant const char* comme argument de modèle

Pourquoi ne pouvez pas vous passer des chaînes de caractères littérales ici? J'ai fait le travail avec une très légère solution de contournement.

template<const char* ptr> struct lols {
    lols() : i(ptr) {}
    std::string i;
};
class file {
public:
    static const char arg[];
};
decltype(file::arg) file::arg = __FILE__;
//Getting the right type declaration for this was irritating, so I C++0xed it.

int main() {
    //lols<__FILE__> hi; 
    //Error: A template argument may not reference a non-external entity
    lols<file::arg> hi; //Perfectly legal
    std::cout << hi.i;
    std::cin.ignore();
    std::cin.get();
}
  • const char file::arg[] = __FILE__; Cela devrait vous permettre de redescendre à C++03 :).
  • J'ai essayé aussi. Compilateur a jeté erreur.
  • Impair. g++ compile très bien (avec -pédant).
  • Irritant, j'ai toujours pensé que c'était impossible. Maintenant que je l'ai, je n'arrive pas à lui faire faire quelque chose d'intéressant ou d'utile.
  • Qu'en essayant const char *const ptr pour l'argument de modèle à la place? Après tout, c'est un littéral.
  • Noter que si, à portée espace de noms, vous aurez besoin extern const char arg[] = __FILE__; de donner la matrice de liaison externe (const objets ont une liaison interne par défaut).
  • Pour ceux qui sont intéressés, David a écrit, comment le faire ici — cpp-next.com/archive/2012/10/...

InformationsquelleAutor Puppy | 2010-09-22