【发布时间】:2017-01-06 13:02:28
【问题描述】:
假设我有一些课程:
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 建议模板用户定义的运算符文字是有效的。根据 /5,您的代码对我来说似乎是正确的。您的编译器没有将运算符模板专门化为(特别是)用户定义的 string 文字运算符,而且我的模板 fu 不足以确定这是否是一个错误,或查找规则的结果。
-
@LightnessRacesinOrbit 我猜 [over.literal] 在这里更合适。似乎涉及文字运算符 id 的函数模板必须遵守固定声明(或多或少
template <char...> double operator "" _x())。显然不允许使用其他形式。 -
@skypjack:措辞让我建议尝试使用显式实例化。
-
@Zorawar:下面的答案很好。
-
@LightnessRacesinOrbit:我知道 :) 我的意思是:“我不明白为什么原则上 ...”也许考虑添加时不够有用你已经在限制论点了?
标签: c++ c++11 templates user-defined-literals