2015-07-12 3 views
0

Вот мой код:Указанный параметр шаблона на конструктору

class test{ 
    public: 
    template<int B> 
    test(const char(&a)[B]){ 
     std::cout<<B<<std::endl; 
    } 
}; 
int main(int argc, char** argv) { 


    test t("test"); 
    return 0; 
} 

выход:

5 

Я делал некоторые исследования и пришли на этот код. Он будет подсчитывать количество символов (-1 для точного). Я задаюсь вопросом о цели указанного int B. внутри параметра шаблона, это сработает, если у меня есть что-то вроде:

class test{ 
public: 
template<char B> 
test(){ 

} 
}; 
int main(int argc, char** argv) { 


    test t(); //error, how to make it work? 

    return 0; 
} 

Мои вопросы:

С первого примера, как же это точно подсчитать количество символов? Какова цель указания типа внутри конструктора шаблона, как из моего примера номер 2, как заставить его работать, если у меня есть тип char? (я получаю сообщение об ошибке при попытке скомпилировать)

ответ

1

В вашем первом примере "test" можно назвать const char s[5] = "test". Оттуда шаблон можно построить как const char(&a)[5], но так как B используется для определения шаблона, «5» захватывается как значение B.

Вы второй пример/вопрос не ясен.

+0

Ааа я имею в виду, как захватить от чего-то, если это символ. Я не знаю, как его реализовать, поэтому у меня нет четкого примера. –

+0

Если вы хотите любое «случайное» значение (значение, которое не имеет специального значения, которое вы не предоставили в вашем примере BTW), просто передайте его в качестве входной переменной. – Amit

+0

Хм, ладно, я как-то понял суть. Поэтому, если он не имеет значения по умолчанию, такого как 'int B = 0', он должен что-то захватить. –

0

Строковые литералы в C++ имеют типы постоянных массивов символов. Таким образом, строковый литерал "test" имеет тип const char[5] (строковые литералы включают завершающий нуль). Таким образом, в первой программе компилятор может определить аргумент шаблона, потому что массив (строковый литерал) передается по ссылке.

Во второй программе эта декларация

test t(); 

является декларацией функции, которая имеет тип возвращаемого test и не имеет параметров.

Если вы хотите, чтобы объявить объект испытания класса во второй программе вы можете написать программу для примера следующим образом

class test{ 
public: 
template<char B = 'A'> 
test(){ 

} 
}; 
int main(int argc, char** argv) { 


    test t; 

    return 0; 
} 
+0

@Amit Согласно стандарту C++ такие конструкции рассматриваются как объявления функций, а не как определение объекта класса. –

+0

неверно, не может использоваться как конструктор по умолчанию – kiviak

+0

@kiviak Прежде всего удалите свой голос, а во-вторых, код верен, и вы можете проверить его, например, с помощью онлайновых компиляторов. на www.ideone.com –

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