Простая специализация функции-члена класса шаблона, которая возвращает значение - PullRequest
0 голосов
/ 12 июня 2018

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

#include <iostream>

class A {};

class B {};

template <typename T>
class C
{
    public:
        C()
        {
            std::cout << "C constructed." << std::endl;
            std::cout << name() << std::endl;;
        }
        template constexpr const char * name();
};

template <> const char * C<A>::name() { return "You got an A."; }
template <> const char * C<B>::name() { return "You got a B."; }


int main()
{
    C<A> c_a;
    C<B> c_b;
    return 0;
}

Сообщения об ошибках: g ++ -std = c ++ 11 -o t1 t1.cpp t1.cpp: 19: 18: ошибка: ожидается «<» перед шаблоном «constexpr» constexpr const char * name ();^ t1.cpp: 22: 26: ошибка: идентификатор шаблона 'name <>' для const char * C :: name () 'не соответствует ни одному шаблону объявления шаблона <> const char * C :: name () {вернуть «Вы получили А.»;} ^ t1.cpp: 22: 37: note: увидел 1 'template <>', нужно 2 для специализации шаблона функции-члена template <> const char * C :: name () {return "Вы получили A.";} ^ t1.cpp: 23: 26: ошибка: идентификатор шаблона 'name <>' для const char * C :: name () 'не соответствует ни одному шаблону объявления шаблона <> const char * C :: name (){return "У тебя есть Б.";} ^ t1.cpp: 23: 37: примечание: увидел 1 'template <>', нужно 2 для специализации шаблона шаблона функции-члена <> const char * C :: name () {return "Вы получили B.";}

Я искал и нашел много обсуждений кода, вызывающего это сообщение об ошибке, но ни случаи, ни рекомендации не кажутся достаточно близкими, чтобы иметь отношение к делу.Кроме того, если я не пытаюсь вернуть что-либо из специализированной функции-члена - если она имеет тип возврата void и просто печатает в cout - тогда это работает так, как я ожидал,т.е. я вижу напечатанный текст с правильными значениями.

Можно ли сделать то, что я пытаюсь сделать?Если так, то как?Спасибо!

Ответы [ 3 ]

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

Вы немного усложняете это.Нет необходимости в «шаблоне» в объявлении функции.Это просто обычная функция, которая находится внутри шаблона класса, и вы хотите специализировать ее для определенных T.Вот способ сделать это:

#include <iostream>

class A {};
class B {};

template <typename T>
class C {
public:
    C() {
        std::cout << "C constructed." << std::endl;
        std::cout << name() << std::endl;;
    }
    static constexpr const char * name();
};

template <> constexpr const char * C<A>::name() { return "You got an A."; }
template <> constexpr const char * C<B>::name() { return "You got a B."; }

int main() {
    C<A> c_a;
    C<B> c_b;
}
0 голосов
/ 12 июня 2018

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

#include <iostream>

class A {};
class B {};

template <typename T>
class C
{
    template <typename U> struct type {};
    public:
        C()
        {
            std::cout << "C constructed." << std::endl;
            std::cout << name<T>() << std::endl;;
        }
        template <typename U> constexpr const char * name()
        {
            return name(type<U>());
        }


    private:
        template <typename U> constexpr const char * name(type<U>) {}
        constexpr const char * name(type<A>) { return "You got an A."; }
        constexpr const char * name(type<B>) { return "You got an B."; }
};

int main()
{
    C<A> c_a;
    C<B> c_b;
    return 0;
}
0 голосов
/ 12 июня 2018

Синтаксис будет:

template <typename T>
class C
{
    public:
        C()
        {
            std::cout << "C constructed." << std::endl;
            std::cout << name() << std::endl;;
        }
        constexpr const char* name();
};

template <> constexpr const char * C<A>::name() { return "You got an A."; }
template <> constexpr const char * C<B>::name() { return "You got a B."; }

Демо

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