C ++模板显式特化 - 调用现有的成员函数

时间:2013-12-27 14:30:05

标签: c++ templates template-specialization

我正在使用显式模板特化来初始化带有信息的std :: vector,但仅针对特定类型的std :: vector,因此显式特化。在构造函数中,如果我尝试在std :: vector中调用push_back或任何其他现有函数,则编译失败。有什么问题,如何解决?

简化示例:

namespace std
{
  template<>
  class vector<int>
  {
  public:
    vector(void)
    {
      int value = 5;
      push_back(value);
    }
  };
}

编译器消息:

In constructor 'std::vector<int>::vector()':
error: 'push_back' was not declared in this scope
       push_back(value);
                      ^

2 个答案:

答案 0 :(得分:4)

显式特化是与主模板分开的完全不同的类。你必须改写一切。

在您控制主模板的正常情况下,您通常会使用某种公共基类或基类模板来收集常见结构。

对于给定的库,添加特化通常是一个非常糟糕的主意(除非库明确说明它没问题)。使用C ++标准库,这是完全未定义的行为。

(主要问题是其他翻译单位可能正在使用您专攻的模板实例化,而不会看到违反单定义规则的专业化。)

答案 1 :(得分:3)

模板特化是主模板和任何其他特化的不相关类型。目前还不清楚你要做什么,因为在std命名空间中提供模板的特化也是非法的,除非专门化使用你自己的用户定义类型。

如果您可以解释要解决的问题,您可能会得到其他选项,例如专门化成员函数而不是模板本身......