2012-05-28 2 views
4

У меня есть конструктор прототип, который выглядит как:Конструктор шаблонов конкретизации с аргументами по умолчанию

template <typename type_position> window(
    const int size[2], 
    const char* caption="Window", const SDL_Surface* icon=NULL, 
    bool fullscreen=false, bool vsync=true, bool resizable=false, int multisample=0, 
    type_position position=type_position(0) 
) 

Затем я хочу, чтобы построить экземпляр:

new window(screen_size,"My Window",NULL,fullscreen); 

вопрос (я предполагаю) является то, что T не может (т. е. может быть int или long или short и т. д.). Я получаю ошибку:

error C2660: 'window' : function does not take 4 arguments

Затем я попытался указать тип:

new window<int>(screen_size,"My Window",NULL,fullscreen); 

Но это не работает:

error C2512: 'window' : no appropriate default constructor available
error C2062: type 'int' unexpected

Я сделал некоторые исследования, и о самое близкое, что я мог получить, было похоже на вопрос «C++ template function default value», за исключением того, что в моем случае параметр шаблона может быть выведен из первого аргумента.

Итак, я застрял или есть что-то, что мне не хватает?

+1

Какой компилятор вы используете? Потому что с VS2010 func («Hello»); работает отлично. –

+0

Не могли бы вы привести короткий пример, который воспроизводит вашу проблему для работы? – chris

+0

Что не работает? Ваше предложение работает для меня: http://ideone.com/n0jgN – jpalecek

ответ

2

Вы можете не предоставить поименный список аргументов шаблона для конструктора, и параметр шаблона не может быть выведенный из аргумента функции по умолчанию, поэтому параметр функции type_position position должен быть предоставлен явно (не дефолтом) для вывода типа.

Поскольку это последний параметр, он предотвращает использование любых аргументов по умолчанию для конструктора. Вы можете изменить порядок параметров конструктора так в type_position дается первым, или вы могли бы добавить фиктивный аргумент, что позволяет ему сделать вывод:

template <typename type_position> window(
    type_position dummy, 
    const int size[2], 
    const char* caption="Window", const SDL_Surface* icon=NULL, 
    bool fullscreen=false, bool vsync=true, bool resizable=false, int multisample=0, 
    type_position position=type_position(0) 
); 

Затем вызовите его с фиктивным первым параметром типа, чтобы вывести :

new window(1, screen_size,"My Window",NULL,fullscreen); 

в качестве альтернативы, если вы используете C++ 11, вы можете предоставить шаблон по умолчанию аргумент в:

template <typename type_position = int> window(
    const int size[2], 
    const char* caption="Window", const SDL_Surface* icon=NULL, 
    bool fullscreen=false, bool vsync=true, bool resizable=false, int multisample=0, 
    type_position position=type_position(0) 
); 

с другой стороны, решить, если вы реальный Мне нужен конструктор шаблона с параметром, который нужно вывести. Что вы планируете делать с типом type_position, если вы не знаете, что это заблаговременно? Действительно ли кто-то может назвать этот конструктор с std::string как параметр position? Или vector<double>? Это может иметь смысл, в зависимости от того, что делает ваш тип, но это не всегда имеет смысл.

0

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

window(
    const int size[2], 
    const char* caption="Window", const SDL_Surface* icon=NULL, 
    bool fullscreen=false, bool vsync=true, bool resizable=false, 
    int multisample=0, 
    int position=0 
) 
+0

OP сказал, что это шаблон _constructor_, а не только шаблон функции. –

+0

Пример изначально был простым шаблоном функции, но это было упрощение. В моем редактировании я изменил его. Извините за путаницу. – imallett

+0

@JonathanWakely: Он изменил вопрос после того, как я ответил. –