显式模板特化

Posted

技术标签:

【中文标题】显式模板特化【英文标题】:Explicit template specialization 【发布时间】:2012-01-22 13:53:00 【问题描述】:

我不想问这样一个笼统的问题,但以下代码是显式模板专业化的练习。我不断收到错误:

c:\users\***\documents\visual studio 2010\projects\template array\template array\array.h(49): error C2910: 'Array::ctor' : 不能明确专门化

#ifndef ARRAY_H
#define ARRAY_H

template <typename t>`
class Array

public:
Array(int);

int getSize()

    return size;

void setSize(int s)

    size = s;

void setArray(int place, t value)

    myArray[place] = value;

t getArray(int place)

    return myArray[place];

private:
    int size;
    t *myArray;
;

template<typename t>
Array<t>::Array(int s=10)

    setSize(s);
    myArray = new t[getSize()];


template<>
class Array<float>

public:
    Array();
 ;

template<>
Array<float>::Array()

    cout<<"Error";
 

#endif

谢谢

【问题讨论】:

【参考方案1】:

特化构造器的实现不是模板!也就是说,你只想写:

Array<float>::Array()

    std::cout << "Error";

实际上,您似乎想限制“数组”类模板的使用不能与“浮点”一起使用,在这种情况下,您可能只想声明而不是定义你将运行时错误转化为编译时错误的专业化:

template <> class Array<float>;

当然,防止类实例化的方法有很多种。然而,创建运行时错误似乎是最糟糕的选择。

【讨论】:

我还是有问题...整个代码应该是什么样子? 删除 'Array::Array()' 前面的 'template'。我得到的其他错误与这个特定问题无关:我需要添加 #include &lt;iostream&gt;using namespace std; 并且我需要从模板化 Array 构造函数的 definition 中删除默认参数(你想要默认声明中的参数)。通过这些更改,它可以使用 g++、clang 和 EDG 的前端为我编译。 奇怪:gcc中需要template &lt;&gt;

以上是关于显式模板特化的主要内容,如果未能解决你的问题,请参考以下文章

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板的学习笔记

C++模板的学习笔记

2020春招字节跳动二面

为啥可变参数模板的模板特化与非可变模板的特化不同?