2012-02-07 7 views
1

я узнал, что:nontypes параметров шаблона

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

Так я сделал следующий код

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

Ах, старый 'const *' vs '* const' каштан ... –

ответ

1

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

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

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

Листинг C-стиля абсолютно лишний. 'c' не является' const', он просто указывает на 'const' массив' char'. –

+0

@MatthieuM: Вы правы, это был остаток. Ред. – ezdazuzena

+0

@ezdazuzena: как вы сказали, я получаю проблему, потому что указатель char на самом деле не является постоянным в первых двух примерах. Но их постоянное по-прежнему не работает. Компилятор показывает ту же ошибку. Также, что вы подразумеваете под «аргументом шаблона непигового типа, представленным в списке аргументов шаблона, является выражение, значение которого может быть определено во время компиляции». »И как они связаны только с int и указателем на объекты с внешней связью .why not float и т. д. –

0

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

Const символ * сопзЬ р = "привет";

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

const char pp [] = "hello";

компилятор будет знать, когда компиляция памяти «привет», а не указатель на другое место. поэтому

Е ("р = р%, р = &% р \ п", р, р &);

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

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

не будет показывать одинаковое значение.

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