Здесь много правильных ответов, но я хотел добавить это (для полноты):
Если вы в нижней части файла cpp реализации выполняете явное инстанцирование всех типов, которые будут использоваться шаблоном с, компоновщик сможет найти их как обычно.
Изменить: добавление примера явного создания экземпляра шаблона. Используется после того, как шаблон определен, и определены все функции-члены.
template class vector<int>;
Это создаст экземпляр (и, следовательно, сделает доступным для компоновщика) класс и все его функции-члены (только). Подобный синтаксис работает для функций шаблона, поэтому, если у вас есть перегрузки операторов, не являющихся членами, вам может понадобиться сделать то же самое для них.
Вышеприведенный пример бесполезен, поскольку вектор полностью определен в заголовках, за исключением случаев, когда common include file (precompiled header?) использует extern template class vector<int>
, чтобы не создавать его из всех других (1000?) файлов, которые используют вектор.
Как отметил @CEvenhuis в вопросительном комментарии, вам нужен экземпляр основной формы.
(И вам вообще не нужны методы расширения. Никогда не делайте - они просто позволяют вызвать код, чтобы выглядеть и чувствовать себя иначе. Но в этом случае в коде, который вы показали, вы просто давая именам животных известным, существующим методам.)
В любом случае, в «дочерней» форме вы можете иметь поле для ссылки на экземпляр основной формы.
Form _parent;
И используйте его как
private void bnTrBack_Click(objects sender, EventArgs e)
{
_parent.Show();
Close();
}
Или, если ребенок является только дочерним по отношению к основной форме,
Main _main;
private void bnTrBack_Click(objects sender, EventArgs e)
{
_main.Show();
Close();
}
Вопрос заключается в том, как установить поле.
Его можно установить в конструкторе:
ReadOnly Main _main;
И смените созданный конструктором код:
public Child()
{
InitializeComponent();
}
на
public Child(Main main)
{
InitializeComponent();
_main = main;
}
Немного отступив, вместо того, чтобы скрывать основную форму, вы можете вместо этого - , если это необходимо - показать дочернюю форму в качестве модального диалога и получить обратно простой результат после его закрытия:
var result = new Child().ShowDialog();
В общем, есть две вещи, которые можно оценить по поводу вариантов: