5

私はクラステンプレートを持っています、それを呼びましょうA、それはメンバー関数を持っていますabc():

template <typename T>
class A{
public:
    T value;
    void abc();
};

abc()次の構文を使用して、クラス宣言の外でメンバー関数を実装できます。

template <typename T>
void A<T>::abc()
{
    value++;
}

私がやりたいことは、このクラスのテンプレートの特殊化を作成することですint

template <>
class A<int>{
public:
    int value;
    void abc();
};

問題はabc()、特殊化されたクラスに実装する正しい構文は何ですか?

次の構文を使用してみました。

template <>
void A<int>::abc()
{
   value += 2;
}

ただし、これはコンパイルされません。

4

2 に答える 2

4

以下を削除しtemplate<>ます。

void A<int>::abc()
{
   value += 2;
}
于 2012-09-04T09:12:07.753 に答える
4
void A<int>::abc()
{
   value += 2;
}

以来、のA<int>です。explicit specialisationA<T>

http://liveworkspace.org/code/982c66b2cbfdb56305180914266831d1

n3337 14.7.3/5

明示的に特殊化されたクラス テンプレートのメンバーは、通常のクラスのメンバーと同じ方法で定義され、 template<> 構文は使用されません

[ 例:

template<class T> struct A {
struct B { };
template<class U> struct C { };
};
template<> struct A<int> {
void f(int);
};
void h() {
A<int> a;
a.f(16);
}
// A<int>::f must be defined somewhere
// template<> not used for a member of an
// explicitly specialized class template
void A<int>::f(int) { /∗ ... ∗/ }

于 2012-09-04T09:12:13.573 に答える