Структура диспетчеризации тегов не может вставлять типы объектов - PullRequest
0 голосов
/ 27 апреля 2011

Я отправляю имя экземпляра объекта apple a("Apple") в функцию eat в пространствах имен tag_dispatch. Почему функция eat не может быть принята объектами instants.

..\tag_dispatch.hpp: In function 'void eat(const T&)':
..\tag_dispatch.hpp:52: error: template argument 1 is invalid
..\tag_dispatch.hpp:52: error: invalid type in declaration before '(' token
..\tag_dispatch.hpp:52: error: invalid use of qualified-name '::apply'
..\mem_define.cpp: In function 'int main()':

Я был объявлен как есть функции, представленные ниже:

#ifndef TAG_DISPATCH_H
#define TAG_DISPATCH_H
struct apple_tag{};
struct banana_tag{};
struct orange_tag{};
struct apple
{
double reduis;
std::string name;
apple(std::string const& n): name(n){}
};

struct banana
{
double length;
std::string name;
banana(std::string const& n): name(n){}
};

namespace dispatch{

template <typename Tag> struct eat{};

template<>struct eat<apple_tag>
{
static void apply(apple const& a){
std::cout<<"Apple tag"<<std::endl;
}
};

template<>struct eat<banana_tag>
{
static void apply(banana const& b){
std::cout<<"Banana tag"<<std::endl;
}
};

}

template <typename T>
void eat(T const& fruit)
{
    dispatch::eat<typename tag<T>::type>::apply(fruit);
}

#endif 

Мой исходный код для компиляции из ссылка здесь

1 Ответ

1 голос
/ 27 апреля 2011

Класс шаблона tag не определен нигде в вашем коде.Шаблон класса tag должен быть определен до того, как вы попытаетесь использовать tag<T>::type.

. Вы должны предоставить специализации шаблона tag для каждого из типов тегов:

template <typename T>
struct tag {};

template <>
struct tag<apple> {typedef apple_tag type;};

template <>
struct tag<banana> {typedef banana_tag type;};
...