Я нашел то, что мне не хватало. Я забыл добавить
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
внизу просмотра.
Виртуальные функции членства инстанцируют, когда шаблон класса инстанцируют, но невиртуальные функции членства инстанцируют, только если их называют.
Это покрыто [temp.inst] в стандарте C++ (В C++ 11, это - §14.7.1/10. В C++ 14, это - §14.7.1/11, и в C++ 17 это - §17.7.1/9. Выборка от C++ 17 ниже)
Реализация не должна неявно инстанцировать шаблона функции, переменного шаблона, членского шаблона, невиртуальной функции членства, членского класса, статического элемента данных шаблона класса или подоператора a
constexpr
если оператор (9.4.1), если такое инстанцирование не требуется
Также обратите внимание, что возможно инстанцировать шаблона класса, даже если некоторые функции членства не instantiable для данных шаблонных параметров. Например:
template <class T>
class Xyzzy
{
public:
void CallFoo() { t.foo(); } // Invoke T::foo()
void CallBar() { t.bar(); } // Invoke T::bar()
private:
T t;
};
class FooBar
{
public:
void foo() { ... }
void bar() { ... }
};
class BarOnly
{
public:
void bar() { ... }
};
int main(int argc, const char** argv)
{
Xyzzy<FooBar> foobar; // Xyzzy<FooBar> is instantiated
Xyzzy<BarOnly> baronly; // Xyzzy<BarOnly> is instantiated
foobar.CallFoo(); // Calls FooBar::foo()
foobar.CallBar(); // Calls FooBar::bar()
baronly.CallBar(); // Calls BarOnly::bar()
return 0;
}
Это допустимо, даже при том, что Xyzzy:: CallFoo () не instantiable, потому что нет такой вещи как BarOnly:: нечто (). Эта функция часто используется как шаблонный инструмент метапрограммирования.
Обратите внимание, однако, что "инстанцирование" шаблона непосредственно не коррелирует к тому, сколько объектного кода сгенерировано. Это будет зависеть от Вашей реализации компилятора/компоновщика.
Я думаю, что это зависит от компилятора и настроек. Например, я полагаю, что MSVC6 генерировал все, но VS2005 не делает. Спецификация говорит, что компилятор не должен, но в реальном мире, это зависит от фактического компилятора (существует много обходных решений в повышении для MSVC6, например). Компоновщик может удалить не имеющие ссылки функции, если/opt:ref включен (для VS, эквивалентные опции существуют для других компиляторов).
Обычно, да.
Весь компилятор действительно знает, то, что Ваша программа может создать по крайней мере один экземпляр каждого класса. Но это не знает то, что Вы сделаете с теми экземплярами. Таким образом, код будет почти бесспорный быть сгенерированным.
Тем не менее, если рассматриваемые методы не являются виртуальными, и никогда не называются, компоновщик может удалить их с его нормальными функциями удаления мертвого кода. Так сгенерированный (и скомпилированный) код не будет в заключительном EXE.
Также это будет в основном зависеть от компилятора C++, используемого, потому что они не являются всеми одинаковыми.