Предположим, у меня есть класс:
template <typename T>
class Foo {
const T* x_;
public:
Foo(const T* str) : x_{str} {}
};
и я предоставляю некоторые определяемые пользователем литералы, которые создают объект Foo
:
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.
У меня такой вопрос: почему я не могу их шаблонировать и не переписывать код?
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) и 7.0.0 (самостоятельно) сообщает:
error: ‘Foo<T> operator""_foo(const T*, std::size_t)’ has invalid argument list
Foo<T> operator"" _foo(const T* str, std::size_t) {
^
Сообщение об ошибке кажется достаточно ясным, но я не вижу причин, по которым мне не следует позволять это делать в принципе; Итак, я делаю это неправильно, или это действительно запрещено?
template <char...> double operator "" _x()
). По-видимому, никакая другая форма не допускается. - person skypjack   schedule 06.01.2017error: template-id 'operator""_foo<>' for 'Foo<char> operator""_foo(const char*, std::size_t)' does not match any template declaration
. Что, опять же, оставляет меня с вопросом: это мой компилятор не улавливает объявление моего шаблона или это просто не разрешено? Я предполагаю, что это должно быть последнее, хотя я не понимаю, почему... - person Zorawar   schedule 06.01.2017