Как специализировать шаблон для массива строк? - PullRequest
0 голосов
/ 29 июня 2018

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

int ia[] = { 6, 7, 8, 3 };
const sav<int> si( ia, sizeof( ia ) / sizeof( ia[ 0 ] ) );
std::string sa[] = { "World" , "Hello" };
const sav<std::string> ss( sa, sizeof( sa ) / sizeof( sa[ 0 ] ) );

И в моем шаблоне у меня есть:

template<typename T>
class sav{
public:
  sav(T* givenArray,size_t size) {
     std::cout<<"not specialized" << std::endl;
  }
};

/* ** */
template<>
class sav<std::string[]>{
public:
    sav(std::string* givenArray[],size_t size) {     
       std::cout<<"specialized" << std::endl;
    }
};

И я хочу использовать второй в ss случае, но он все еще работает с первым.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Это потому, что вы используете sav<std::string>, когда специализация sav<std::string[]>.

Специализация должна быть sav<std::string>.

Of и ваш специализированный sav конструктор также неверны, поскольку первый аргумент - это «массив» указателей на std::string.

0 голосов
/ 29 июня 2018

Если вы поняли, что ваше намерение исправить, специализированный конструктор должен быть объявлен так:

template<>
class sav<std::string[]> {
public:
    sav(std::string givenArray[], size_t size) {
        std::cout << "specialized" << std::endl;
    }
};

и используется так:

const sav<std::string[]> ss(sa, sizeof(sa) / sizeof(sa[0]));

Обновление:

Вы также можете объявить конструктор так:

template<>
class sav<std::string> {
public:
    sav(std::string* givenArray , size_t size) {
        std::cout << "specialized" << std::endl;
    }
};

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

const sav<std::string> ss(sa, sizeof(sa) / sizeof(sa[0]));
0 голосов
/ 29 июня 2018

Вы указываете аргумент шаблона как std::string, но не массив. Я полагаю, вы должны специализировать шаблон как

template<>
class sav<std::string>{
public:
    sav(std::string* givenArray,size_t size) {     
       std::cout<<"specialized" << std::endl;
    }
};

ЖИТЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...