Вывод аргумента для функций-членов шаблона не работает для классов, объявленных внутри функции? - PullRequest
5 голосов
/ 02 июля 2011
struct Test
{
        template <class T>
        void print(T& t)
    {
        t.print();
    }
};

struct A
{
    void print() {printf( "A");}
};

struct B
{
    void print() {printf( "B");}
};

void test_it()
{   
    A a;
    B b;

    Test t;
    t.print(a);
    t.print(b);
}

Это прекрасно компилируется.

struct Test
{
        template <class T>
        void print(T& t)
    {
        t.print();
    }
};


void test_it()
{   
    struct A
    {
        void print() {printf( "A");}
    };

    struct B
    {
        void print() {printf( "B");}
    };

    A a;
    B b;

    Test t;
    t.print(a);
    t.print(b);
}

Это не с ошибкой: нет соответствующей функции для вызова 'Test :: print (test_it () :: A &)'

Может кто-нибудь объяснить мне, почему это произошло? Спасибо !!!

1 Ответ

8 голосов
/ 02 июля 2011

Во втором примере A и B - это локальные типы, которые нельзя использовать в качестве аргументов типов шаблонов в C ++ 03 согласно §14.3.1 / 2 :

Локальный тип, тип без связи, безымянный тип или тип, составленный из любого из этих типов, не должны использоваться в качестве аргумента шаблона для параметра типа шаблона.

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