РЕДАКТИРОВАТЬ: хорошо название вашего вопроса вводит в заблуждение
"Мне нужен класс, который принимает два параметра в своем конструкторе. Первый может быть либо int, double, либо float, поэтому второй всегда является строковым литералом" my string ", поэтому я предполагаю, что const char * const . "
Похоже, вы пытаетесь достичь:
template<typename T>
class Foo
{
public:
Foo(T t, const char* s) : first(t), second(s)
{
// do something
}
private:
T first;
const char* second;
};
Это будет работать для любого типа, для первого параметра: int
, float
, double
, что угодно.
Теперь, если вы действительно хотите ограничить тип первого параметра, будет только int
, float
или double
; Вы можете придумать что-то более сложное, как
template<typename T>
struct RestrictType;
template<>
struct RestrictType<int>
{
typedef int Type;
};
template<>
struct RestrictType<float>
{
typedef float Type;
};
template<>
struct RestrictType<double>
{
typedef double Type;
};
template<typename T>
class Foo
{
typedef typename RestrictType<T>::Type FirstType;
public:
Foo(FirstType t, const char* s) : first(t), second(s)
{
// do something
}
private:
FirstType first;
const char* second;
};
int main()
{
Foo<int> f1(0, "can");
Foo<float> f2(1, "i");
Foo<double> f3(1, "have");
//Foo<char> f4(0, "a pony?");
}
Если вы удалите комментарий в последней строке, вы получите ошибку компилятора.
Строковые литералы не разрешены в C ++ 2003
ИСО / МЭК 14882-2003 §14.1:
14.1 Параметры шаблона
Нетипизированный шаблон-параметр должен иметь один из следующих (необязательно квалифицированных cv) типов:
- целочисленный или перечислимый тип,
- указатель на объект или указатель на функцию,
- ссылка на объект или ссылка на функцию,
- указатель на член.
ИСО / МЭК 14882-2003 §14.3.2:
14.3.2 Шаблонные нетиповые аргументы
Шаблонный аргумент для нетипичного, не шаблонного шаблонного параметра должен быть одним из:
- целочисленная константа-выражение целочисленного или перечислительного типа; или
- имя нетипового шаблона-параметра; или
- адрес объекта или функции с внешней связью, включая шаблоны функций и идентификаторы шаблонов функций, но исключая нестатические члены класса, выраженный как & id выражение, где & является необязательным, если имя относится к функции или массиву или если соответствующий шаблон-параметр является ссылкой; или
- указатель на член, выраженный как описано в 5.3.1.
[Примечание: строковый литерал (2.13.4) не удовлетворяет требованиям какой-либо из этих категорий и, следовательно, не является приемлемым аргументом шаблона.
[Пример:
template<class T, char* p> class X {
//...
X();
X(const char* q) { /* ... */ }
};
X<int,"Studebaker"> x1; //error: string literal as template-argument
char p[] = "Vivisectionist";
X<int,p> x2; //OK
- конец примера] - конец заметки]
И похоже, что он не изменится в следующем C ++ 0X, см. Текущий черновик 14.4.2 Аргументы нетипичных шаблонов .