2015-02-06 2 views
0

У меня есть класс шаблона, который имеет некоторые конструкторы копирования шаблонов и это работа. Но я хочу специализировать конструктор копирования для int и не могу этого сделать. Эта программа печатает: «CC». Но нужно: «iC» Помогите мне, пожалуйста.шаблоны копировать конструкторы внутри класса шаблона

#include <cstdio> 
    #include <cstdlib> 
    #include <iostream> 

    template<class X> 
    class complex 
    { 
    public: 
     complex() {} 
     template<class T> complex(const complex<T>& c) {std::cout << "2";} 
     template<class T> complex(const complex<T*>& c) {std::cout << "1"; } 
     complex(const complex<X>& c) {std::cout << "C";} 

     template<int> complex(const complex<int>& c){std::cout << "i";} 
    }; 

    int main(int argc, char *argv[]) 
    { 

     complex<int> c1; 
     complex<double> c2; 

     complex<int> c3(c1); //2 
     complex<double> c4(c2); 

    } 

ответ

0

С X == int, как в вашем случае complex<int> c3(c1) (инициализации complex<int> из другого complex<int>), ваш нешаблонный complex(const complex<int>& c) будет считаться лучше, чем матчем вашей специализации шаблона, так что это работает, как ожидалось.

Попробуйте что-нибудь вдоль линий complex<double> c5(c1), где типы не совпадают. В этом случае конструктор без шаблона, так как он хочет получить аргумент complex<double>, не будет выбран лучше, чем ваша специализация.

+0

Я мог бы сделать это сегодня, добавив новый класс со специализацией. 'шаблон
комплекс класса { общественности: \t комплекс() {} \t шаблон комплекс (Const комплекс & с) {станд :: соиЬ << "2";} \t шаблон комплекс (const complex & c) {std :: cout << "1"; } \t complex (const complex & c) {std :: cout << "Базовая копия con" << std :: endl;} }; шаблон <> комплекс класса { общественности: \t комплекс() {} \t комплекс (Const комплекс & с) {станд :: соиЬ << "я";} }; ' –