Załóżmy, że mam jakąś klasę:Czy mogę szablonować zdefiniowane przez użytkownika literały?
template <typename T>
class Foo {
const T* x_;
public:
Foo(const T* str) : x_{str} {}
};
i podać kilka zdefiniowanych przez użytkownika literały, które tworzą Foo
obiektu:
Foo<char> operator"" _foo(const char* str, std::size_t) {
return Foo<char>{str};
}
Foo<wchar_t> operator"" _foo(const wchar_t* str, std::size_t) {
return Foo<wchar_t>{str};
}
// etc. for char16_t and char32_t.
Moje pytanie jest takie: dlaczego nie mogę szablon nich i zapisać konieczności przepisać kod?
template <typename T>
Foo<T> operator"" _foo(const T* str, std::size_t) {
return Foo<T>{str};
}
gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.4) oraz 7.0.0 (skompilowany siebie) Sprawozdanie
wiadomośćerror: ‘Foo<T> operator""_foo(const T*, std::size_t)’ has invalid argument list
Foo<T> operator"" _foo(const T* str, std::size_t) {
^
Błąd wydaje się być na tyle jasne, ale Nie widzę powodu, dla którego nie wolno mi było zasadniczo tego robić; więc czy robię to niepoprawnie, czy jest to naprawdę zabronione?
2.14.8/3 sugestia szablon literały operatora zdefiniowane przez użytkownika są ważne. Per/5, Twój kod wydaje mi się prawidłowy. Twój kompilator nie zbiera specjalizacji szablonu operatora jako (konkretnie) zdefiniowanego przez użytkownika _string_ literal operatora, a mój szablon fu nie jest wystarczająco dobry, aby dowiedzieć się, czy jest to błąd, czy konsekwencja reguł wyszukiwania. –
@LightnessRacesinOrbit Domyślam się, że [over.literal] jest bardziej odpowiedni. Wygląda na to, że szablon funkcji, który zawiera literalny identyfikator operatora, musi być zgodny ze stałą deklaracją (mniej więcej "szablon podwójny operator" "_x()"). Żadna inna forma nie jest dozwolona. –
skypjack
@skypjack: Sformułowanie sprawia, że sugeruję wypróbowanie go z jawną instancją. –