【问题标题】: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

谢谢

【问题讨论】:

    标签: c++ templates template-specialization explicit


    【解决方案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;。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多