いくつかのクラスがあるとします:
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) {
^
エラー メッセージは十分に明確に見えますが、原則としてこれを許可してはならない理由がわかりません。それで、私はこれを間違ってやっていますか、それとも本当に許可されていませんか?