#include <iostream>
using namespace std;
template <class T>
class Pointer
{
private:
T* value;
public:
Pointer(T* pointer)
{
value=pointer;
}
T* GetValue()
{
return value;
}
};
class Int:public Pointer<int>
{
public:
int GetInt()
{
return *GetValue();
}
};
int main(void)
{
int* tmp=new int;
*tmp=4;
Int i(tmp);//error C2664: 'Int::Int' : cannot convert parameter 1 from 'int *' to 'const class Int &'
//Reason: cannot convert from 'int *' to 'const class Int'
//No constructor could take the source type, or constructor overload resolution was ambiguous
cout<<i.GetInt();
delete tmp;
return 0;
}
В чём тут ошибка? pointer<int> intpointer(tmp) понимает, Int i(tmp), нет.
Здравствуйте, Аноним, Вы писали:
А>Какой тогда default constructor у Int?
Конструкторы не наследуются.
Если в классе не объявлены конструкторы — тогда и только тогда считается, что есть неявный конструктор без параметров.
Конструктор копирования, однако, определяется всегда — явно или неявно.
Итого: объяви оба конструктора Int<> — без параметров и с единственным параметром.
Кстати, подумай — не explicit ли он должен быть? Насколько безопасно случайное приведение голого указателя int* к типу Int ?
Перекуём баги на фичи!
Re[4]: cannot convert parameter
От:
Аноним
Дата:
06.12.05 19:28
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Например такой: А>
А>Int(): Pointer<int>(NULL) {}
А>
А>или такой, если объединить: А>
А>Int(int *p = NULL): Pointer<int>(p) {}
А>
Это Вы о default значении. Я про default constructor. Если не описывать constructor вообще, по идеи он должен быть Int::Int(int*)
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Какой тогда default constructor у Int?
К>Конструкторы не наследуются. К>Если в классе не объявлены конструкторы — тогда и только тогда считается, что есть неявный конструктор без параметров.
Int i; error C2512: 'Int' : no appropriate default constructor available
Здравствуйте, Олег Гашев, Вы писали:
ОГ>Int i; error C2512: 'Int' : no appropriate default constructor available
Потому что дефолтный конструктор (aka конструктор без параметров) неявно определяется через дефолтные конструкторы всех баз и членов.
Между тем, его база — Pointer<int> — не имеет дефолтного конструктора.
Аналогично: если были бы приняты специальные меры против конструктора копирования Pointer<int> (а копи-ктор живучий, зараза!), то невозможно было бы неявно определить конструктор копирования Int.