【发布时间】:2012-09-25 18:30:22
【问题描述】:
我有一些代码在 MSVC 下编译得很好(或者说是发送给我的 Windows 开发人员),但在 CLang 下会出错。环顾四周后,我发现 CLang 在解决模板专业化方面确实更加严格,但我不确定我应该将专业化放在哪里。基本上我的一个文件有这样的结构:
template<>
struct iterator_traits< char * > // error is here
{
typedef random_access_iterator_tag iterator_category;
typedef char value_type;
typedef ptrdiff_t difference_type;
typedef difference_type distance_type;
typedef char * pointer;
typedef char & reference;
};
这是在 namespace std 块内。错误信息是:
Explicit specialization of 'std::iterator_traits<char *>' after instantiation
同一错误消息的另一部分(通过在 Xcode 中“扩展”错误消息查看)显示 Implicit instantiation first required here,点击它会将我带到 stl_iterator.h,特别是这一行(第 642 行):
typedef typename iterator_traits<_Iterator>::iterator_category
iterator_category;
有谁知道在这种情况下正确的做法是什么?我见过涉及类的示例,但从未见过涉及结构的示例。
【问题讨论】:
-
这看起来像标准库代码。你是不是偶然尝试用 Clang 编译 MS 标准库?
-
检查您是否包含标准库的正确标题。除此之外,
struct和class几乎可以互换(唯一的区别是struct中的默认访问说明符是public) -
@KerrekSB 将来自
std的东西专门化,例如用于自定义迭代器的std::iterator_traits,在标准库之外非常普遍(即使还有其他方法,例如从std::iterator派生)。尽管为char*执行此操作仍然很奇怪,因为标准库已经为任何T*提供了一个。 -
@ChristianRau:我很确定您只能将来自
std的模板专门用于用户定义的类型。 -
@KerrekSB 是的,看起来(在阅读了亚当的回答之后)。我只是指出这不一定看起来像标准库代码。
标签: c++ xcode macos clang template-specialization