2013-09-15 3 views
-8

Я знаю, что мы можем определить шаблоны, используя константы. Например:Почему мы не можем передавать строки в качестве аргументов шаблона?

template<int N> 
struct FixedArray { 
    double values[N]; 
    int size() { return N; } // Could be static 
}; 


int main(int, char**) { 
    FixedArray<10> arr; 
    arr.values[0] = 3.14; 
    cout << "first element=" << arr.values[0] << endl; 
    cout << "size=" << arr.size() << endl; 
    return 0; 
} 

Этот конкретный пример позволяет нам определить массив с постоянным размером.

Но почему мы не можем передавать строки в качестве аргументов шаблона в C++?

Следующий слайд должен объяснить это, но я не понимаю, где проблема.

Если кто-то может указать на меня и объяснить это, я был бы признателен. Благодаря

enter image description here

+4

Какую часть слайда вы не получили? – Ryan

+0

Я отредактировал свой вопрос. Надеюсь, теперь все ясно. – Shookie

ответ

2

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

template <char *> struct Foo { }; 

char x; 

int main() 
{ 
    Foo<&x> a; 
} 

Дело в том, что x теперь хорошо определен, названный объект связи, поэтому его адрес является глобально, STA ­ ти ­ чески известное количество. Указатель, полученный из строкового литерала, не имеет одинаковых качеств; это не адрес именованной переменной.

+0

Я не совсем уверен, что вижу разницу между внутренним указателем и указателем на символ. Почему это имеет значение, если это адрес именованной переменной или нет? – Shookie

+0

@Shookie: Нет никакой разницы между двумя типами указателей. Позвольте мне изменить его, чтобы сделать его менее запутанным. –

+0

@Shookie: адрес именованной переменной является единственным видом указателя, который разрешен как аргумент шаблона непигового типа. Это единственный тип нелицевой константы, который «достаточно постоянный». –

Смежные вопросы