【发布时间】:2017-10-02 13:59:01
【问题描述】:
Converter 类旨在将字符串转换为另一种类型。所以如果目标也是一个字符串,那么它应该只返回原始值的副本。
工作代码是这样的:
template<typename C>
class Converter {
public:
template<typename T>
static T To(const std::wstring& obj);
template<>
static std::wstring To(const std::wstring& obj) {
return obj;
}
};
template<typename C>
template<typename T>
T Converter<C>::To(const std::wstring& obj) {
// Conversion
return T();
}
(适用于 VC++2015 Update 3)
我尝试将专业化方法移到类声明之外,如下所示:
template<typename C>
template<>
std::wstring Converter<C>::To<std::wstring>(const std::wstring& obj) {
return obj;
}
还有几个编译错误:
错误 C3212 'Converter::To':a 的显式特化 模板成员必须是显式特化的成员
错误 C2768 'Converter::To':非法使用显式模板 论据
【问题讨论】:
-
你的“工作代码”doesn't even work.
-
我认为根据标准,两者实际上都是非法的,但出于某种原因,MSVC 还是允许第一个。两者都不能在 GCC 下工作。看起来如果不专门化外部模板,您就无法明确专门化内部模板。
-
@cdhowie 在 VC++2015 上工作。
-
@cdhowie 它被标记为 [visual-c++]。它适用于 Visual C++。
-
旁注:您在第一个示例中的第二个声明不是专业化。特化将指定模板的参数:
To<std::wstring>。如果可以创建一个没有任何参数的函数模板,我会说它更接近于重载。
标签: c++ templates visual-c++