почему вызывается специализированный шаблон? - PullRequest
0 голосов
/ 12 апреля 2020

Я создал шаблон с именем debug, который косвенно вызывается через функцию errorMsg. Затем я специализировал шаблон для учета char * (надеюсь, что код с комментариями ниже поможет с объяснениями)

После некоторой игры я был удивлен, что, хотя я определил специализации шаблона в какой-то момент после их вызова в errorMsg () они все еще использовались.

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

Любая помощь в решении этой проблемы была бы велика, спасибо

#include  "header.h"
int main()
{

    //std::vector<std::string> s_vec{"abc","cede","rfind"};
    int i = 3;
    int *j = &i;
    errorMsg(std::cout,"hey"); //<---calls debug
}


//defined specialisations after its invoked inside errorMsg
template <>
inline std::string debug(char * p)
{
    std::cout<<"specialsed char"<<std::endl;
    return debug(std::string(p));
}

template <>
inline std::string debug(const char *p)
{
    std::cout<<"specialised const char"<<std::endl;
    return debug(std::string(p));

(header.h)

#include <iostream>
#include <sstream>
#include <string>

//(1)
template <typename T>
std::string debug(const T&s)
{   
    std::cout<<"unspecialised obj"<<std::endl;
    std::ostringstream oss;
    oss<<s;
    return oss.str();
}

//(2)
template <typename T>
std::string debug(T *ptr)
{   
    std::cout<<"unspecialised raw ptr"<<std::endl;
    std::ostringstream oss;
    oss << "pointer: "<<ptr;
    if (ptr)
    {   
        oss<<" "<<debug(*ptr);
    }
    else
        oss<<" null pointer";

    return oss.str();
}

template <typename T, typename... Args> void print(std::ostream &os,const T &t,const Args&...rest);
template <typename T> std::ostream &print(std::ostream &os, const T &t);


template <typename... Args>
void errorMsg(std::ostream &os,Args &&...args)
{
    print(os,debug(std::forward<Args>(args))...); //debug called here
}

template <typename T>
std::ostream &print(std::ostream &os, const T &t)
{
    return os<<t<<std::endl;
}

template <typename T, typename... Args>
void print(std::ostream &os,const T &t,const Args&...rest)

{
    os<<t<<", ";
    print(os,rest...);
}

результат:

specialised const char
unspecialised obj
hey

1 Ответ

0 голосов
/ 12 апреля 2020

[temp.expl.spec] / 6 Если шаблон, шаблон элемента или элемент шаблона класса явно специализированы, то эта специализация должна быть объявлена ​​до первого ее использования. специализация, которая привела бы к неявной реализации в каждой единице перевода, в которой происходит такое использование; Диагностика не требуется c.

Ваша программа некорректна; нет диагностики c требуется.

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