Здесь я определить шаблон класса Foo, специализироваться своей функцией-члена, а затем поставить частичную специализацию для этого класса:то путает о шаблоне класса частичной специализации и член класса специализации
// this is Foo_0
template<typename T, typename S>
class Foo {
public:
void operator()() {
std::cout << "Foo_0\n";
}
template<typename R>
void bar(R) {
std::cout << "I'm from Foo_0\n";
}
};
template<>
template<>
void Foo<double, int>::bar(double) {
std::cout << "Now I'm specialized!\n";
}
// this is Foo_1
template<typename T>
class Foo<T, int> {
public:
void operator()() {
std::cout << "Foo_1\n";
}
};
И экземпляр Foo на VS2015 как это:
Удивительно, но F() печатает "Foo_0", что означает частичную специализированный шаблон Foo_1 не выбран. Что еще странно, когда я комментирую специализацию Foo :: bar (double), f() печатает «Foo_1»!
Тогда я проверить это:
Foo<int, int> f;
f();
На этот раз, ф() также печатает "Foo_1", класс специализации применяется.
Таким образом, специализация элемента bar() влияет на применение частичной специализации шаблона класса. Это правда? Почему это работает так?
Попробуйте переместить специализированную спецификацию шаблона функции ниже специализации шаблона частичного класса. –
@Kerrek SB Когда я его перемещаю, компилятор жалуется, что «класс Foo не имеет панели элементов», кажется, что бар (double) считается членом Foo_1. – Dardai
gcc успешно диагностирует проблему (в отличие от clang) [Demo] (http://coliru.stacked-crooked.com/a/ed9bb1a4e9682621). ('ошибка: частичная специализация 'class Foo' после создания класса 'Foo ' [-fpermissive]') –
Jarod42