C ++: принудительно завершить компиляцию шаблонов (MSVC / G ++) - PullRequest
6 голосов
/ 02 ноября 2011

Здравствуйте и хорошего вам дня.

Следующий фрагмент кода компилируется на cl.exe (15.00.30729.01) и mingw-g ++ (4.4.0):

template<typename T> class Test{
public:
    T t;
    void error(){
        int doesNotExist = 6;
        return doesNotExist;//<---- void function returning result
    }
};

int main(int argc, char** argv){
    Test<int> test;
    return 0;
}

Также,на cl.exe вы даже можете получить что-то вроде этого:

template<typename T> class Test{
public:
    T t;
    void error(){
        doesNotExist = 6;//<---- undeclared variable
        return doesNotExist;//<---- void function returning result
    }
};

Теперь это, очевидно, происходит потому, что компилятор не создает содержимое для методов класса шаблона, пока кто-то их не вызовет.Однако это может создать проблемы при разработке большого класса шаблона (поскольку вы, скорее всего, забудете добавить тестовый вызов где-нибудь в новый метод).

Вопрос: * 1013Есть ли переключатель компилятора для g ++ или cl.exe, который заставит компилятор обрабатывать весь шаблон (поэтому этот фрагмент кода вызовет ошибку компиляции)?

1 Ответ

11 голосов
/ 02 ноября 2011

Если вы хотите протестировать шаблон с несколькими типами, вы можете инициировать ручное создание экземпляров типов, например:

// at namespace level
template class Test<int>;

Явные экземпляры шаблонов классов автоматически запускают создание всех членов,кажется, это то, что вы хотите.

Фактическая проблема заключается в том, что язык предназначен для явного разрешения поведения, которого вы хотите избежать.Когда шаблон класса создается неявно, компилятор создает экземпляры только тех методов, которые используются .Основной вариант использования этой функции заключается в том, что некоторые методы могут предъявлять более строгие требования к экземпляру типа, чем другие, если бы все методы были созданы всегда , тогда шаблон класса мог бы использоваться только с теми типами, которые удовлетворяют более строгим требованиям.,

Позволяя компилятору создавать экземпляры только тех методов, которые используются, шаблон класса можно использовать с типами, которые не удовлетворяют всем требованиям всех методов, если они соответствуют требованиямметоды, которые на самом деле используются.

Типичным примером является operator[] в std::map<>, который требует, чтобы value_type был конструируемым по умолчанию (operator[] создаст новый объект по умолчанию инициализирован если ключ отсутствует в контейнере и возвращается ссылка на него).Поведение в языке позволяет использовать std::map для типов, которые не конструируемые по умолчанию , если вы не используете operator[] (или любую другую функцию-член, налагающую это требование).

...