Шаблоны

Здравствуйте, есть простенькая программа:

#include <iostream>
using namespace std;

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

int main()
{
     complex<int> c1;
     complex<double> c2;
     complex<int*> c3;

     complex<int> c4(c3);
     complex<int> c5(c1);
     complex<int> c6(c2);
     complex<float> c7(c1);
     complex<double> c8(c2);

     cin.get();
     return 0;
}

Я никак не могу понять почему complex<double> c8(c2); не вызывает template<class T> complex(const complex<T>& c){cout <<«1»;}. Прошу разъяснить ситуацию :(

Потому что шаблонный конструктор не замещает конструктор копирования.

Но ведь complex<int> c6(c2); срабатывает. А отличие лишь в том что c6(c2) типа complex<int>, а с8(с2) типа complex<double>. Так почему complex<double> (complex<double>) не вызывает шаблонный конструктор, а complex<int> (complex<double>) вызывает? Я просто хочу понять почему так происходит :(

А, всё, кажется я понял, спасибо, Croessmah :)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.