Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp
, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.
Была функция с ключевым словом export
, которая была предназначенный для отдельной компиляции. Функция export
устарела в C++11
и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export
. Отдельная компиляция невозможна в C++
или C++11
, но, возможно, в C++17
, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.
Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.
Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.
Жесткая проблема... Однако, если Вы хотите определить только эти readonly
атрибут, можно сделать это как это:
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId,
ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? new { @readonly = "readonly" }
: null)
%>
, Если Вы хотите определить больше атрибутов тогда, необходимо определить два анонимных типа и иметь несколько копий атрибутов. Например, что-то вроде этого (который я не люблю так или иначе):
ClientId.Length > 0
? (object)new { @readonly = "readonly", @class = "myCSS" }
: (object)new { @class = "myCSS" }
Я думаю, что это должно быть
<%= ((bool) Eval("InRole")) ? "checked" : "" %>
вместо этого в ответе leppies.
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
, По крайней мере, это не работало на меня с #, но это работало с =. Я делал что-то не так? Спасибо за совет так или иначе :)
И альтернатива должна только испустить его как простой HTML. Да, редактор заставит Вас думать, что Вы неправы, но это, кажется, происходит вполне часто с VS2008SP1. Этот пример специально для флажков, который, кажется, полностью потрачен впустую в CTP5, но он дает Вам общее представление, как испустить условные атрибуты.
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
<%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />