Объявление друга литерального оператора в шаблоне класса - PullRequest
2 голосов
/ 11 декабря 2019

Я пытаюсь создать класс, который может быть создан только с помощью литерального оператора, но он не может быть основан на gcc.

Вот упрощенный пример:

#include <cstddef>

template<typename C>
class Foo;
Foo<char> operator "" _foo(const char*, std::size_t);

template<typename C>
class Foo
{
    Foo() = default;
    friend Foo<char> operator "" _foo(const char*, std::size_t);
};

Foo<char> operator "" _foo(const char* str, std::size_t size)
{
    return Foo<char>();
}

int main()
{
    auto foo = "Foo"_foo;
    return 0;
}

Ошибка с таким сообщением: https://godbolt.org/z/kfcNMR

<source>:11:22: error: 'Foo<char> operator""_foo(const char*, std::size_t)' has invalid argument list

Работает на clang и msvc, а без шаблона работает на gcc: https://godbolt.org/z/exfm5Q

Это ошибка компилятора или нетЯ ошибаюсь?

1 Ответ

0 голосов
/ 12 декабря 2019

Это ошибка, о которой было сообщено 5 лет назад.

Ошибка 61648 - g ++ принимает друзей буквального оператора для классов, не являющихся шаблонами, но не для template classes

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61648

...