Это продолжение моего предыдущего вопроса .
Я пытаюсь создать шаблон класса с вложенным шаблоном класса, где вложенный шаблон класса имеет статическую функцию, для которой яхочу предоставить специализацию.
Вот мой тестовый код, который не предусматривает специализацию вложенного класса.Обратите внимание на существование пустого класса NullType
- это то, на чем я хочу специализировать вложенный класс.
#include <cstdlib>
#include <iostream>
using namespace std;
class NullType {};
template<class FooParam> struct Foo
{
template<class BarParam> struct Bar
{
static bool Magic();
};
};
template<class FooParam>
template<class BarParam>
bool Foo<FooParam>::Bar<BarParam>::Magic()
{
return true;
}
int main()
{
bool b = Foo<int>::Bar<int>::Magic();
cout << b << " ";
bool b2 = Foo<int>::Bar<NullType>::Magic();
cout << b2 << " ";
}
Этот код компилируется и запускается, как и ожидалось.Вывод:
1 1
Теперь я хочу предоставить специализацию Bar::Magic
для NullType
и вернуть эту функцию false
.Желаемый результат:
1 0
Итак, я попытался написать специализацию следующим образом:
template<class FooParam>
template<>
bool Foo<FooParam>::Bar<NullType>::Magic()
{
return false;
} // COMPILER ERROR HERE C3855
Это определение появляется перед существующим определением для Foo::Bar::Magic()
.
Однако этот код приводит к ошибке компилятора:
1>.\main.cpp(20) : error C3855: 'Foo<FooParam>::Bar<BarParam>': template parameter 'BarParam' is incompatible with the declaration
... на закрывающей скобке, указанной выше.
Какой синтаксис можно использовать для обеспечения этой специализации?Я открыт для любых методов для достижения моей главной цели (возвращая false
для NullType
и true
для всего остального), если:
- Внешние библиотеки не используются (нетBoost)
- Используется только соответствующий C ++
Foo
- шаблон класса, а Bar
- либо вложенный шаблон класса, либо шаблон функции.Функция, которая возвращает false
или true
, должна быть специализированной или перегружаемой таким образом, чтобы при вызове кода для NullType
возвращалось false
, а все остальное возвращало true
.
Я уточню требования при необходимости.