3

Кто-нибудь знает, если это явная специализация или не является действительным:Является ли эта явная спецификация шаблона шаблона-члена шаблона-члена шаблона класса действительным?

template <class> 
struct L { 
    template <typename T> 
    struct O { 
    template <typename U> 
    static void Fun(U); 
    }; 
}; 

template<> 
template<typename T> 
template<typename U> 
void L<int>::O<T>::Fun(U) {} 

лязг ствол (12/3/2013) дает следующее сообщение об ошибке:
F: ... \ test.cpp: 36: 20: ошибка: определение вне «линии связи» из класса «O» без определения

void L<int>::O<T>::Fun(U) {} 
    ~~~~~~~~~~~~~~^ 

1 возникшая ошибка.

Любые вспомогательные ссылки со стандарта, чтобы оправдать ваш ответ, будем очень благодарны!

Примечание: Я несколько удивлен, что это ошибка - я бы ожидать, что специализация будет выбрана для любого семейства аргументов шаблона, с которым «Fun» инстанциируется начиная с <int><?any><?any>.

Это лязг ошибка или ошибка в моих ожиданиях?

Спасибо!

====== EDIT (я думаю, что у меня есть ответ) ========

OK - я думаю, что я нашел в поддержку формулировки - от N3797 (пост-чикаго 2013 Рабочий проект) - 14.7.3/16 =>

«В явном объявлении специализации для члена шаблона класса или шаблона члена, который появляется в области пространства имен, шаблон-член и некоторые из его вмещающих шаблонов классов могут оставаться неспециализированными, за исключением того, что декларация не должна явно специализировать шаблон члена класса, если его встроенные шаблоны классов также не являются явно специализированными ».

Если я правильно интерпретирую это, нам нужна явная специализация O, если мы собираемся объявить явную специализацию его члена? Отсюда и ошибка.

Исправить?

Спасибо!

ответ

3

Я не верю, что это действительно. Я недостаточно глубоко на этом языке, чтобы рассказать вам, как/если вы можете это сделать, не предоставляя специализацию верхнего уровня, как показано ниже, или если есть ярлык для пропуски шаблонов репликации, но сообщение об ошибке довольно ясно: Вы пытаетесь обеспечить реализацию статического члена зависимого вложенного типа без предоставления специализации фактической зависимости. То есть это работает:

#include <iostream> 

template <typename> 
struct L 
{ 
    template <typename T> 
    struct O 
    { 
     template <typename U> 
     static void Fun(U) 
     { 
      std::cout << "General: " << __PRETTY_FUNCTION__ << std::endl; 
     }; 
    }; 
}; 

// provide specialized L 
template<> 
struct L<int> 
{ 
    template <typename T> 
    struct O 
    { 
     template <typename U> 
     static void Fun(U); 
    }; 
}; 

// L<int> is a specialized type, so provide the rest. 
template<typename T> 
template<typename U> 
void L<int>::O<T>::Fun(U) 
{ 
    std::cout << "Special: " << __PRETTY_FUNCTION__ << std::endl; 
} 


int main() 
{ 
    L<int>::O<double> nobj; 
    nobj.Fun(10); 

    L<double>::O<int> nobj2; 
    nobj2.Fun(20); 

    return 0; 
} 

Выход

Special: static void L<int>::O<double>::Fun(U) [T = double, U = int] 
General: static void L<double>::O<int>::Fun(U) [T = int, U = int] 
+0

Я на самом деле думаю, что вам просто нужно предоставить: 'шаблон <> шаблон структура L :: O { шаблон статической силы Fun (U); }; - но я все еще не уверен, зачем это нужно? –

+0

Вы правы, и с этим вы можете использовать decl для функции, указанной вами ранее. Если я получу шанс (хаос @ home), я обновлю это. – WhozCraig

Смежные вопросы