Определение члена шаблона класса шаблона отдельно от объявления - PullRequest
4 голосов
/ 30 апреля 2011
#include <cstdlib>

template<class A> struct Foo
{
    template<class B> static bool Bar();
};

template<class B> template<class A>  bool Foo<A>::Bar<B>()
{
    return true;
}

int main()
{
    bool b = Foo<int>::Bar<long>();
    b;
}

Это приводит к ошибке компоновщика:

main.obj : error LNK2019: unresolved external symbol "public: static bool __cdecl Foo<int>::Bar<long>(void)" (??$Bar@J@?$Foo@H@@SA_NXZ) referenced in function main

Мне нужно определить эту функцию-член вне объявления шаблона класса.Другими словами, я не могу этого сделать:

#include <cstdlib>
template<class A> struct Foo
{
    template<class B> static bool Bar()
    {
        return true;
    }
};

int main()
{
    bool b = Foo<int>::Bar<long>();
    b;
}

Что мне не хватает?Как я могу определить этот шаблон функции-члена?Какой синтаксис нужен?

Примечание: я использую MSVC 2008, на случай, если это уместно.

РЕДАКТИРОВАТЬ

Первое, что я попытался, - это изменить порядок * 1014.* и template<class B>:

#include <cstdlib>

template<class A> struct Foo
{
    template<class B> static bool Bar();
};

template<class A> template<class B>  bool Foo<A>::Bar<B>()
{
    return true;
}

int main()
{
    bool b = Foo<int>::Bar<long>();
    b;
}

Это привело к ошибке компилятора:

.\main.cpp(11) : error C2768: 'Foo<A>::Bar' : illegal use of explicit template arguments

В закрывающей скобке определения для функции Bar.

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

Просто измените порядок на template<class B> template<class A>.Второй является «внутренним» и соответствует объявлению члена.См. §14.5.2 / 1.

Также, как указывает Джон, удалите список параметров из Bar<B>.

// "outer" template: this parameter gets substituted to create "inner" template
template< class A >

// "inner" template stands alone after "outer" substitution
template< class B >

bool
// This will just be a class name after "outer" substitution.
      foo<A>
// This has usual function template syntax
             :: Bar() {
2 голосов
/ 30 апреля 2011

Это работает для меня:

template<class A>
template<class B>
bool Foo<A>::Bar()
{
    return true;
}

Порядок, в котором вы пишете два спецификатора template, имеет значение (внешний шаблон идет первым). Кроме того, если вы на самом деле указываете <B> на имя шаблона функции, по крайней мере один компилятор (GCC) считает, что вы пытаетесь частично специализировать функцию Bar, что невозможно.

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