没有模板专业化"继承"会员/功能?

时间:2014-05-07 23:10:37

标签: c++ templates

我刚刚开始使用C ++,我正在尝试创建一个扩展basic_string<的功能的类。 unsigned char>让它接受chars作为构造函数的参数,并且它们将通过转换它们并调用basic_string的基础构造函数来处理。

我被告知要使用模板专业化,但我一直在努力,所以我创建了一个简单的当前问题摘录:模板专业化如何工作:

template<typename T> class TestClass{
  public:
    // Sample constructor
    TestClass(const char* name){
      std::cout << "Created class " << name << std::endl;
    }
};

// Doesn't add any functionalities, just used as an example
template<> class TestClass<int>{};

正如所料,如果我使用以下内容:

  TestClass<char> test = TestClass<char>("Test");

文件编译,输出正确。

但如果我使用以下内容:

  TestClass<int> specializedTest = TestClass<int>("Specialized Test");

该文件无法编译,抛出以下错误

test.cpp: In function ‘int main()’:
test.cpp:50:69: error: no matching function for call to ‘TestClass<int>::TestClass(const char [17])’
test.cpp:50:69: note: candidates are:
test.cpp:47:18: note: TestClass<int>::TestClass()
test.cpp:47:18: note:   candidate expects 0 arguments, 1 provided
test.cpp:47:18: note: TestClass<int>::TestClass(const TestClass<int>&)
test.cpp:47:18: note:   no known conversion for argument 1 from ‘const char [17]’ to ‘const TestClass<int>&’

问题1 :专业类不应该继承TestClass的成员和函数吗?因为如果没有,我认为我只是创建一个类并将其“屏蔽”为基类。即(伪代码)

class SpecializedTestClass{/* Add class code here */};
typedef SpecializedTestClass TestClass<int>;

如果没有,为什么不呢?对我来说有意义的是,如果你是一个专门的课程,所有班级成员/职能都应该保留,除非他们是专门的。

也许我只是将模板与类继承混合在一起。

问题2 :这是解决我问题的最佳方法吗? (结合basic_string&lt; unsigned char&gt;和basic_string&lt; char&gt;的功能,使数据存储为unsigned char,但可以使用类型转换从char分配。)

2 个答案:

答案 0 :(得分:3)

  

问题1:专业类不应该继承TestClass的成员和函数吗?

它没有,它是一种完全不相关的类型。这是故意的,考虑std::vector<T>std::vector<bool>,成员完全不同。专业化扩展类型,而是为特定需求提供不同类型。专业化中没有 base 类。

  

问题2:这是解决我问题的最佳方法吗?

我不确定要解决的真正问题是什么。已经存在从charunsigned char的隐式转换,因此接口中应该接受正常的字符...对吗?如果你的意思是传递const char*,(即指针,而不是值),那么你可以在外部提供辅助功能:

basic_string<unsigned char> create(const char* s) {
   return basic_string<unsigned char>(reinterpret_cast<unsigned char*>(s));
}

答案 1 :(得分:3)

没有。当您(明确或部分)专门化一个类时,您的专业化是一个全新的模板。它与现有模板共享的唯一内容就是它的名称。

至于为什么,我们只能猜测。两个显而易见的原因是,相当困难(大多数编译器在编写标准之后多年没有正确实现当前的部分专业化规范),并且可能(最好)是否可取。( / p>

至于这是最好的方法:我对此表示怀疑,但我也没有更好的建议。让string / basic_string很好地处理unsigned char几乎是一个问题,因为它是发明的,我还没有找到一种处理它的方法,但却产生了特别好的结果。