C ++ вызов перегруженного конструктора класса неоднозначен - PullRequest
0 голосов
/ 25 сентября 2018

Я знаю, что подобные вопросы задавались ранее.Однако я не понимаю, почему это неоднозначно.

Я создаю класс foo и хочу либо задать ему вектор, либо несколько значений.Но моему компилятору это не нравится.Почему это так?

#include <vector>

template <class T>
class foo
{
public:
        foo(std::vector<int> dims) { }
        foo(int s1, int s2) { }
};

int main(int argc, char **argv)
{
        foo<double> x({7,3});
        return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Проблема в том, что вы явно не указали компилятору, какой именно вы пытаетесь вызвать здесь.Если вы хотите вызвать конструктор, которому передан вектор, вам нужно явно сообщить об этом компилятору.Вы можете использовать прямую инициализацию списка:

foo<int> x(std::vector<int>{ 7,3 });
0 голосов
/ 25 сентября 2018

Поскольку в вашем классе есть компилятор, сгенерированный конструктором копирования / перемещения.


Итак, у вас есть дубликаты для

foo(const foo&)  // foo can be constructed by {7,3}
foo(vector<int>) // vector<int> can be constructed by {7,3}

Возможно, вы пытаетесь сделать инициализация списка , но ваш синтаксис неверен.

Нет T object({arg1, arg2, ...})

Но если вы используете foo x{7,3} (что соответствует T object{arg1, arg2, ...}), это сработает и вызовет foo(int,int).


Кстати, вы должны учиться и всегда читать ошибку , по крайней мере, на Wandbox , ошибка довольно ясна

ошибка: вызов перегружен 'foo () 'является неоднозначным ...

примечание: кандидат:' foo :: foo (std :: vector) '

примечание: кандидат:' constexpr foo :: foo (const foo &) '

примечание: кандидат:' constexpr foo :: foo (foo &&) '

Это ясно показывает, что он считает кандидатом.

...