параметр шаблона нетипичного типа - PullRequest
1 голос
/ 07 февраля 2012

Я узнал, что:

  • Нетипичные параметры шаблона несут некоторые ограничения. Как правило, они могут быть постоянными целочисленными значениями (включая перечисления) или указателями на объекты с внешней связью.

Итак, я сделал следующий код

1.

 template <char const* name> 

 class MyClass { 
    … 
 }; 

 char const* s = "hello";  

 MyClass<s> x;         // ERROR:

Этот код не работал и выдает ошибку 's' is not a valid template argument

Мой второй код тоже не работал

2.

template <char const* name> 
class MyClass { 
  … 
}; 

extern char const *s = "hello";

MyClass<s> x;     //error 's' is not a valid template argument` 

Но, как ни странно, этот код в порядке

3.

template <char const* name> 
class MyClass { 
  … 
};

extern char const s[] = "hello";

MyClass<s> x;        // OK  

скажите, пожалуйста, что происходит во всех этих трех кодах ??

также расскажите, как исправить ошибки, чтобы заставить работать два других кода.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

С здесь:"Аргумент шаблона нетипичного типа, предоставленный в списке аргументов шаблона, является выражением , значение которого можно определить во время компиляции ".

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

int main() {
        char const *c = "foor";
        std::cout << "c: " << c << std::endl;
        c = "bar";
        std::cout << "c: " << c << std::endl;
}

Что даст вам

c: foo
c: bar
0 голосов
/ 13 января 2015

Я думаю, что проблема здесь: даже

const char * const p = "hello";

определяют только переменную-указатель, в которой хранится адрес памяти, значениепамять не может быть определена при компиляции.но

const char pp [] = "hello";

компилятор будет знать, когда компилируется память "hello", а не указатель куда-то еще.поэтому

printf ("p =% p, & p =% p \ n", p, p);

получит то же значение.но

printf ("pp =% p, & pp =% p \ n", pp, & pp);

не покажет одно и то же значение.

...