2013-07-02 1 views
3

ИнформацияШаблон Алиас с Значение по умолчанию

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

Код будет выглядеть

template<typename T = double> 
struct mystruct {}; 

template<typename T = double> using myalias = mystruct<T>; 

int main(void) { 

    myalias MyStructWithDouble; // causes compilation error 
    myalias<int> MyStructWithInt; 

    return 0; 
} 

Компилятор (г ++ 4.7 в данном случае) вполне доволен включением = double в определении псевдонима, но это, кажется, то это игнорировать.

Я пробовал что-то вроде «специализирующегося» на псевдониме, но там компилятор не хватил.

Вопрос

Почему компилятор принимает значение по умолчанию в Defintion, если мы не имеем права использовать его? Во-вторых, есть ли способ добиться этого?

Мотивация

Этот пример очень простой, но в моем реальном коде псевдоним позволит сэкономить много печатать (есть более чем один параметр шаблона)

ответ

8

Так же, как с помощью шаблонов классов, вы по-прежнему необходимо указать пустой список аргументов шаблона:

myalias<> MyStructWithDouble; // compiles 
+0

Не могли бы вы объяснить, почему это так? Если бы я создал это непосредственно из 'mystruct', я могу просто набрать' mystruct MyStructWithDouble',? – Dan

+0

@ Dan: Нет, вы не можете, по крайней мере, не без нестандартного расширения компилятора. Например, GCC говорит 'ошибка: недопустимое использование имени шаблона 'mystruct' без списка аргументов' – JohannesD

+0

Моя ошибка. Есть ли причина для этого? Может ли компилятор не сказать, что 'myalias' означает то же самое, что' myalias <> '? И есть ли способ «обмануть» это поведение от компилятора? – Dan