У меня есть класс с двумя конструкторами, один из которых не имеет аргументов, а другой - один аргумент.
Создание объектов с использованием конструктора, который принимает один аргумент, работает как ожидалось. Однако, если я создаю объекты, используя конструктор, который не принимает аргументов, я получаю ошибку.
Например, если я скомпилирую этот код (используя g ++ 4.0.1) ...
class Foo
{
public:
Foo() {};
Foo(int a) {};
void bar() {};
};
int main()
{
// this works...
Foo foo1(1);
foo1.bar();
// this does not...
Foo foo2();
foo2.bar();
return 0;
}
... я получаю следующую ошибку:
nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’
Почему это так, и как мне заставить это работать?
Ответы:
изменить на
Вы получаете ошибку, потому что компилятор думает о
как объявление функции с именем 'foo2' и типом возврата 'Foo'.
Но в этом случае, если мы изменим на
Foo foo2
, компилятор может показать ошибку" call of overloaded ‘Foo()’ is ambiguous"
.источник
Только для записи..
На самом деле это не решение вашего кода, но у меня было то же сообщение об ошибке при неправильном доступе к методу экземпляра класса, на который указывает
myPointerToClass
, например,где
было бы, очевидно, правильно.
источник
Добавляя в базу знаний, я получил ту же ошибку для
Хотя IDE дал мне правильные члены для class_iter. Очевидно, проблема в том, что
"anything"::iterator
не вызывается член,num
поэтому мне нужно разыменовать его. Который не работает так:...по всей видимости. Я в конце концов решил это с этим:
Я надеюсь, что это поможет тому, кто сталкивается с этим вопросом, как я.
источник
Скобки не требуются для создания экземпляров объекта класса, если вы не собираетесь использовать параметризованный конструктор.
Просто используйте Foo foo2;
Это будет работать.
источник
У меня была похожая ошибка, похоже, что компилятор неправильно понял вызов конструктора без аргументов. Я сделал это, удалив скобки из объявления переменной, в вашем коде что-то вроде этого:
источник
[stmt.ambig/1]
и[dcl.ambig.res/1]
в стандарте прямо указывается, что в случае неоднозначности все, что можно интерпретировать как объявление, является декларацией, чтобы разрешить эту неоднозначность.)Я столкнулся с случаем, когда я получил это сообщение об ошибке и имел
и в основном пытался передать временный объект Bar конструктору Foo. Оказывается, компилятор переводил это
то есть объявление функции, чье имя foo возвращает Foo, принимающий аргумент - указатель на функцию, возвращающий Bar с 0 аргументами. При прохождении временных темпов, таких как этот, лучше использовать
Bar{}
вместоBar()
устранения двусмысленности.источник
Если вы хотите объявить новое вещество без параметров (зная, что у объекта есть параметры по умолчанию), не пишите
но
источник
Конечно, это ключевой случай этой ошибки, но я получил ее в другой ситуации, когда пытался перегрузить присвоение
operator=
. Это было немного загадочно IMO (из g ++ 8.1.1).Я получил 2 "одинаковые" ошибки
(Эквивалентная погрешность
clang
составляет:error: member reference base type 'float' is not a structure or union
)для линий
data.i = data;
иdata.f = data;
. Оказывается, компилятор путал имя локальной переменной 'data' и мою переменную-членdata
. Когда я изменил это наvoid operator=(T newData)
иdata.i = newData;
,data.f = newData;
ошибка ушла.источник
@MykolaGolubyev уже дал замечательное объяснение. Я искал решение для чего-то подобного,
MyClass obj ( MyAnotherClass() )
но компилятор интерпретировал его как объявление функции.C ++ 11 имеет фигурный список инициализации . Используя это, мы можем сделать что-то вроде этого
Тем не менее, это:
выдает ошибку компиляции, как она считает,
t
как типTemp(String (*)())
.источник