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:措辭使我建議嘗試一個明確的實例。 –