2017-01-06 39 views
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) { 
               ^

該錯誤消息似乎是很清楚,但原則上我不認爲有理由不允許我這樣做;那麼,我是不正確地做這件事,還是真的不允許?

+0

2.14.8/3建議模板用戶定義的操作符文字是有效的。 Per/5,對我來說,你的代碼看起來是正確的。你的編譯器沒有將操作符模板專用化爲(特別是)用戶定義的_string_ literal運算符,而我的模板fu不足以確定這是一個錯誤還是查找規則的結果。 –

+0

@LightnessRacesinOrbit我想[over.literal]在這裏更合適。看起來,涉及文字操作符id的函數模板必須遵循固定聲明(或多或少爲'template double operator「」_x()')。沒有其他形式是明顯允許的。 – skypjack

+1

@skypjack:措辭使我建議嘗試一個明確的實例。 –

回答

相關問題