Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
1

Неоднозначный вызов конструктора

16.04.2015, 00:10. Просмотров 663. Ответов 6
Метки нет (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Verylong{
public:
    
    Verylong (long x = 0) { enter(x);}
 
    Verylong (const Verylong& vrl) : _sign(vrl._sign), lnum(vrl.lnum) {/*empty*/}
 
    explicit Verylong (const std::string& str) { enter(str);}
            
    explicit Verylong (const char* ch) { std::string str(ch); enter(str);}
    // ...
};
 
//...
return Verylong(0);  // Здесь
Ошибка:
D:\c++\verylong.h: In member function 'my::Verylong my::Verylong::operator*(const my::Verylong&) const':
D:\c++\verylong.h:461:30: error: call of overloaded 'Verylong(int)' is ambiguous
return Verylong(0);
^
D:\c++\verylong.h:461:30: note: candidates are:
D:\c++\verylong.h:58:22: note: my::Verylong::Verylong(const char*)
explicit Verylong (const char* ch) { std::string str(ch); enter(str);}
^
D:\c++\verylong.h:56:22: note: my::Verylong::Verylong(const string&)
explicit Verylong (const std::string& str) { enter(str);}
^
D:\c++\verylong.h:54:13: note: my::Verylong::Verylong(const my::Verylong&)
Verylong (const Verylong& vrl) : _sign(vrl._sign), lnum(vrl.lnum) {/*empty*/}
^
D:\c++\verylong.h:52:13: note: my::Verylong::Verylong(long int)
Verylong (long x = 0) { enter(x);}
Добавлено через 6 минут
по идее 0 должен привестись к типу long , или для каждого типа создавать свой конструктор?
Если не сложно объясните подробно что не так
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2015, 00:10
Ответы с готовыми решениями:

Неоднозначный вызов перегруженной функции
Ввести с клавиатуры число n. Динамически выделить память для массива целых чисел размером n....

Неоднозначный вызов перегруженной функции
Ошибка 1 error C2668: hash_helper::hash: неоднозначный вызов перегруженной функции...

Неоднозначный вызов перегруженной функции
#include "stdafx.h" #include <cstdlib> #include <iostream> #include <math.h> #include...

Pow: неоднозначный вызов перегруженной функции
Помогите решить проблему: double HHDistrib::MX(int power) { double M = 0; for (int m =...

6
14022 / 7507 / 1777
Регистрация: 30.01.2014
Сообщений: 12,561
16.04.2015, 00:33 2
Цитата Сообщение от pety Посмотреть сообщение
по идее 0 должен привестись к типу long
С таким же успехом ноль приводится к указателю. Эти преобразования с т.з. стандарта равноправны, отсюда неоднозначность.
Качаем последний черновик стандарта. Открываем параграф 13.3.3.1.1 Standard conversion sequences. Там есть табличка. В ней нас интересуют два вида преобразования Integral conversions (преобразование int->long) и Pointer conversions (преобразование 0->ptr). Видно, что все они находятся в одной группе и имеют одинаковый Rank. Поэтому и получается неоднозначность.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
16.04.2015, 03:26  [ТС] 3
и как это можно переписать?

Добавлено через 2 минуты
В смысле как переписать конструкторы, можно ли явно указать, что целочисленные литералы должны приводиться к long?

Добавлено через 9 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Качаем последний черновик стандарта
А есть русская версия?
0
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
16.04.2015, 05:52 4
Цитата Сообщение от pety Посмотреть сообщение
А есть русская версия?
pety, перевода стандарта на русский нет, вроде бы. А вот FAQ от Бьярне Страуструпа по стандарту С++11 есть.
0
14022 / 7507 / 1777
Регистрация: 30.01.2014
Сообщений: 12,561
16.04.2015, 08:38 5
Цитата Сообщение от pety Посмотреть сообщение
В смысле как переписать конструкторы, можно ли явно указать, что целочисленные литералы должны приводиться к long?
В твоем случае достаточно убрать конструктор
C++
1
explicit Verylong (const char* ch)
Т.к. он все равно создает std::string, тоже самое будет происходить и без него, с использованием конструктора
C++
1
explicit Verylong (const std::string& str)
Но вообще, можно, например, так (C++11):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <type_traits>
#include <string>
#include <cstdio>
 
class Verylong
{
public:
    template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
    Verylong(T x)
        : Verylong(static_cast<long>(x))
    { }
    Verylong(long x = 0)
    {
        std::printf("%s\n", __PRETTY_FUNCTION__);
    }
 
    Verylong (const Verylong & vrl) { }
 
    explicit Verylong (const std::string& str) { }
 
    explicit Verylong (const char* ch) { }
    // ...
};
 
int main()
{
    Verylong v1 = 1;
    Verylong v2 = 1L;
    Verylong v3 = 1UL;
    Verylong v4 = 1ULL;
    Verylong v5 = 0;
}
http://rextester.com/BFM81657
http://rextester.com/RKME40883

Добавлено через 1 минуту
Цитата Сообщение от pety Посмотреть сообщение
А есть русская версия?
Русской нет. Умение читать на английском точно такой же жизненно необходимый навык для программиста, как и знание языка программирования.
0
1 / 1 / 0
Регистрация: 11.12.2014
Сообщений: 116
16.04.2015, 15:02  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
В твоем случае достаточно убрать конструктор
Код C++
1
explicit Verylong (const char* ch)
действительно

А объясните что значит сия конструкция?
template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
Verylong(T x)
: Verylong(static_cast<long>(x))
{ }
0
14022 / 7507 / 1777
Регистрация: 30.01.2014
Сообщений: 12,561
16.04.2015, 18:05 7
Цитата Сообщение от pety Посмотреть сообщение
А объясните что значит сия конструкция?
Если на пальцах, то это конструктор с шаблонным параметром и дополнительной проверкой типа на принадлежность одному из целочисленных типов в С++. Если проверка успешна, то будет осуществлен вызов этого конструктора, который, в свою очередь, делегирует значение конструктору с long, предварительно преобразовав аргумент. Таким образом реализуется требование:
Цитата Сообщение от pety Посмотреть сообщение
целочисленные литералы должны приводиться к long
и разрешается неоднозначность с преобразованием 0.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2015, 18:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Ошибка: неоднозначный вызов перегруженной функции
Ошибка:= error C2668: TCalc::TCalc: неоднозначный вызов перегруженной...

Неоднозначный вызов перегруженной функции (sqrt)
Вот в программе написано: int n, b; n = sqrt(b); // &lt;-- Неоднозначный вызов перегруженной...

pow: неоднозначный вызов перегруженной функции
#include &lt;iostream&gt; using namespace std; int main() { int i; double res= {0},r; i=0;r=0;...

неоднозначный вызов перегруженной функции pow
Ошибка 1 error C2668: pow: неоднозначный вызов перегруженной функции 2 IntelliSense: существует...

Pow: неоднозначный вызов перегруженной функции
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; #include...

Ругается на неоднозначный вызов перегруженной функции
Делаю все по примерам не могу понять в чем ошибка. Уверен что ошибка элементарная. Ругается на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.