специализация не шаблонной функции внутри шаблонного класса - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть этот шаблонный класс, который имеет функции-члены, и они не являются шаблонными функциями.

template <class T> class myclass {
    T x;
public:
    myclass(T a);
    T getx() { return x; }
};

// Explicit specialization for int.
template <> class myclass<int> {
    int x;
public:
    myclass(int a) {
        cout << "Inside myclass<int> specialization\n";
        x = a * a;
    }
    int getx() { return x; }
};


int main()
{

    myclass<int> i(10);
    cout << "int: " << i.getx() << "\n";

    myclass<double> d(10.1);
    cout << "double: " << d.getx() << "\n\n";

    myclass<float> f(5);
    cout << "float: " << f.getx() << "\n";
    return 0;
}

Я думал, смогу ли я специализировать свой конструктор, что-то вроде:

myclass<char>::myclass(char a)
{
    x = a;
}

и я попробовал несколько разных способов, таких как:

template<class T>
myclass<T>::myclass(T a)
{
    x = a;
}
template <>
myclass<char>::myclass(char a)
{
    x = a;
}//Error: explicit specialization; 'myclass<char>::myclass(T)' has already been instantiated

, но мне не удалось это сделать. Я думал, так как моя функция конструктора не является функцией шаблона, это невозможно.

, но затем в этом коде:

template <class T>
class simpleClass
{
private:
    T data;
public:
    simpleClass(T n);
    void show();
};

//*************
simpleClass<int>::simpleClass(int a)
{
    data = a;
};
template <class  T>
simpleClass<T>::simpleClass(T n)
{
    data = n;
}
//******************
template <class  T>
void simpleClass<T>::show()
{
    cout << data << endl;
}


int main()
{
    simpleClass<int> x(25);
    cout << "int x = ";
    x.show();
    simpleClass<string> str("computer science");
    cout << "string str = ";
    str.show();
    simpleClass<double> d(1.25);
    cout << "double d = ";
    d.show();
    cin.get();
}

Я добавляю это:

simpleClass<int>::simpleClass(int a)
{
    data = a;
};

и программа работала.

Я недавно узнал о шаблонах и не знаю, законно ли то, что я пытаюсь сделать, или нет, и если это возможно, как я могу это сделать?

1 Ответ

0 голосов
/ 21 апреля 2020

Моя специализация основного шаблона происходит после явной специализации. Это была ошибка.

это было:

// Explicit specialization for int.
template <> class myclass<int> {
    int x;
public:
    myclass(int a) {
        cout << "Inside myclass<int> specialization\n";
        x = a * a;
    }
    int getx() { return x; }
};
template <>
myclass<char>::myclass(char a)
{
    x = a;
}

но это должно быть так:

template <>
myclass<char>::myclass(char a)
{
    x = a;
}

// Explicit specialization for int.
template <> class myclass<int> {
    int x;
public:
    myclass(int a) {
        cout << "Inside myclass<int> specialization\n";
        x = a * a;
    }
    int getx() { return x; }
};

Однако я понятия не имею, почему это так важно, Любое объяснение будет оценено.

...