Если Xcode недавно обновился, вам, возможно, придется согласиться с новыми условиями лицензии. Если вы не согласны с условиями лицензии, FileMerge (при запуске из SourceTree) немедленно прекратит работу.
Чтобы проверить это, откройте оболочку и запустите от имени обычного пользователя:
$ opendiff
Если проблема в лицензии, она сообщит вам. Чтобы согласиться с новыми условиями лицензии, вам нужно запустить open diff, используя sudo
:
$ sudo opendiff
После принятия условий лицензии вы можете повторить попытку запуска FileMerge из SourceTree с помощью Resolve Conflicts > Launch External Merge Tool
. FileMerge должен запускаться и вести себя нормально.
Здесь вы определяете только структуру, но не выделяете ее. Попробуйте следующее:
class Foo{
public:
struct Bar{
int otherdata;
} mybar;
int somedata;
};
int main(){
Foo foo;
foo.mybar.otherdata = 5;
cout << foo.mybar.otherdata;
return 0;
}
Если вы хотите повторно использовать структуру в других классах, вы также можете определить структуру снаружи:
struct Bar {
int otherdata;
};
class Foo {
public:
Bar mybar;
int somedata;
}
Бар
- это внутренняя структура, определенная внутри Foo
. Создание объекта Foo
неявно не создает членов Bar
. Вам необходимо явно создать объект Bar, используя синтаксис Foo :: Bar
.
Foo foo;
Foo::Bar fooBar;
fooBar.otherdata = 5;
cout << fooBar.otherdata;
В противном случае
Создайте экземпляр Bar как член в классе Foo
.
class Foo{
public:
struct Bar{
int otherdata;
};
int somedata;
Bar myBar; //Now, Foo has Bar's instance as member
};
Foo foo;
foo.myBar.otherdata = 5;
Вы создаете вложенную структуру, но никогда не создаете ее экземпляров внутри класса. Вам нужно сказать что-то вроде:
class Foo{
public:
struct Bar{
int otherdata;
};
Bar bar;
int somedata;
};
Затем вы можете сказать:
foo.bar.otherdata = 5;
Вы объявляете только Foo :: Bar но вы не создаете его экземпляр (не уверен, что это правильная терминология)
См. использование здесь:
#include <iostream>
using namespace std;
class Foo
{
public:
struct Bar
{
int otherdata;
};
Bar bar;
int somedata;
};
int main(){
Foo::Bar bar;
bar.otherdata = 6;
cout << bar.otherdata << endl;
Foo foo;
//foo.Bar.otherdata = 5;
foo.bar.otherdata = 5;
//cout << foo.Bar.otherdata;
cout << foo.bar.otherdata << endl;
return 0;
}
struct Bar{
int otherdata;
};
Здесь вы только что определили структуру, но не создали ни одного объекта Это. Следовательно, когда вы говорите foo.Bar.otherdata = 5;
, это ошибка компилятора. Создайте объект структуры Bar, например Bar m_bar;
, а затем используйте Foo.m_bar.otherdata = 5;