我正在使用显式模板特化来初始化带有信息的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);
^
答案 0 :(得分:4)
显式特化是与主模板分开的完全不同的类。你必须改写一切。
在您控制主模板的正常情况下,您通常会使用某种公共基类或基类模板来收集常见结构。
对于给定的库,添加特化通常是一个非常糟糕的主意(除非库明确说明它没问题)。使用C ++标准库,这是完全未定义的行为。
(主要问题是其他翻译单位可能正在使用您专攻的模板实例化,而不会看到违反单定义规则的专业化。)
答案 1 :(得分:3)
模板特化是主模板和任何其他特化的不相关类型。目前还不清楚你要做什么,因为在std
命名空间中提供模板的特化也是非法的,除非专门化使用你自己的用户定义类型。
如果您可以解释要解决的问题,您可能会得到其他选项,例如专门化成员函数而不是模板本身......