cannot convert parameter
От: Аноним  
Дата: 06.12.05 18:38
Оценка:
#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), нет.
Re: cannot convert parameter
От: Аноним  
Дата: 06.12.05 19:05
Оценка:
Добавь в класс Int конструктор:
class Int:public Pointer<int>
{
public:
    Int(int *p): Pointer<int>(p) {}

    int GetInt()
    {
        return *GetValue();
    }
};
Re[2]: cannot convert parameter
От: Аноним  
Дата: 06.12.05 19:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добавь в класс Int конструктор:

А>
А>class Int:public Pointer<int>
А>{
А>public:
А>    Int(int *p): Pointer<int>(p) {}

А>    int GetInt()
А>    {
А>        return *GetValue();
А>    }
А>};
А>



Какой тогда default constructor у Int?
Re[3]: cannot convert parameter
От: Аноним  
Дата: 06.12.05 19:20
Оценка:
Например такой:
Int(): Pointer<int>(NULL) {}

или такой, если объединить:
Int(int *p = NULL): Pointer<int>(p) {}
Re[3]: cannot convert parameter
От: Кодт Россия  
Дата: 06.12.05 19:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Какой тогда 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*)
Re[4]: cannot convert parameter
От: Олег Гашев
Дата: 06.12.05 19:31
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>Какой тогда default constructor у Int?


К>Конструкторы не наследуются.

К>Если в классе не объявлены конструкторы — тогда и только тогда считается, что есть неявный конструктор без параметров.

Int i; error C2512: 'Int' : no appropriate default constructor available

Остаётся тогда конструктор копирования.
Либо я найду путь, либо проложу его. © Свифт
Re[5]: cannot convert parameter
От: Кодт Россия  
Дата: 06.12.05 20:39
Оценка:
Здравствуйте, Олег Гашев, Вы писали:

ОГ>Int i; error C2512: 'Int' : no appropriate default constructor available


Потому что дефолтный конструктор (aka конструктор без параметров) неявно определяется через дефолтные конструкторы всех баз и членов.
Между тем, его база — Pointer<int> — не имеет дефолтного конструктора.

Аналогично: если были бы приняты специальные меры против конструктора копирования Pointer<int> (а копи-ктор живучий, зараза!), то невозможно было бы неявно определить конструктор копирования Int.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.