3

私はそのような一般的な質問をするのは嫌いですが、次のコードは明示的なテンプレートの特殊化の演習です。エラーが発生し続けます:

c:\ users \ *** \ document \ visual studio 2010 \ projects \ template array \ template array \ array.h(49):エラー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

ありがとう

4

1 に答える 1

5

スペシャライゼーションのコンストラクターの実装はテンプレートではありません!つまり、次のように記述します。

Array<float>::Array()
{
    std::cout << "Error";
}

実際には、「Array」クラステンプレートの使用を「float」で使用しないように制限したいようです。その場合、実行時エラーをコンパイルに変換するための特殊化を宣言するだけで、定義しないことができます。 -タイムエラー:

template <> class Array<float>;

もちろん、クラスのインスタンス化を防ぐ方法にはさまざまなバリエーションがあります。ただし、実行時エラーを作成することは最悪のオプションのようです。

于 2012-01-22T14:00:56.077 に答える