Они имеют тип char[N]
, где N
- количество символов, включая завершающий \0
. Поэтому да, вы можете назначить их char*
, но вы все равно не можете писать им (эффект будет неопределенным).
Wrt argv
: указывает на массив указателей на строки. Эти строки явно изменяемы. Вы можете изменить их, и они должны удерживать последнее сохраненное значение.
Это просто невозможно. Вы не можете пересылать объявление вложенной структуры за пределы контейнера. Вы можете только перенаправить объявление в контейнере.
Вам необходимо выполнить одно из следующих действий
Я не верю, что прямое объявление внутреннего класса для неполного класса работает (потому что без определения класса невозможно узнать, действительно ли является внутренним класс). Таким образом, вам нужно будет включить определение контейнера с внутренним классом, объявленным вперед:
class Container {
public:
class Iterator;
};
Затем в отдельном заголовке реализовать Container :: Iterator:
class Container::Iterator {
};
Затем # включить только заголовок контейнера (или не беспокоиться о пересылке объявить и просто включить оба)
Я не знаю способа сделать именно то, что вы хотите, но вот обходной путь, если вы хотите использовать шаблоны:
// Foo.h
struct Foo
{
export template<class T> void Read(T it);
};
// Foo.cpp
#include "Foo.h"
#include "Container.h"
/*
struct Container
{
struct Inner { };
};
*/
export template<>
void Foo::Read<Container::Inner>(Container::Inner& it)
{
}
#include "Foo.h"
int main()
{
Foo f;
Container::Inner i;
f.Read(i); // ok
f.Read(3); // error
}
Надеюсь, эта идиома может быть вам полезна (и, надеюсь, ваш компилятор основан на EDG и реализует экспорт;)).