14
假设我有一些类:我可以模板用户定义的文字吗?
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) {
^
该错误消息似乎是很清楚,但原则上我不认为有理由不允许我这样做;那么,我是不正确地做这件事,还是真的不允许?
2.14.8/3建议模板用户定义的操作符文字是有效的。 Per/5,对我来说,你的代码看起来是正确的。你的编译器没有将操作符模板专用化为(特别是)用户定义的_string_ literal运算符,而我的模板fu不足以确定这是一个错误还是查找规则的结果。 –
@LightnessRacesinOrbit我想[over.literal]在这里更合适。看起来,涉及文字操作符id的函数模板必须遵循固定声明(或多或少为'template double operator“”_x()')。没有其他形式是明显允许的。 –
skypjack
@skypjack:措辞使我建议尝试一个明确的实例。 –