2017-01-06 38 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:措辞使我建议尝试一个明确的实例。 –

回答

相关问题