Я пытаюсь определить функцию шаблона, у которой есть параметр типа и параметр, не являющийся типом. Однако тип параметра, не являющегося типом, зависит от параметра типа. Это выглядит так:

template<typename T>
class A{
    typedef T* Pointer;
};

template<typename T, A<typename T>::Pointer P>
T fun(){
    return *P;
}

int main(){
    fun<int, (int*)0>();
}

Если я компилирую код, компилятор жалуется:

test.cpp:6:34: error: template argument 1 is invalid
 template<typename T, A<typename T>::Pointer P>
                                  ^
test.cpp:6:45: error: expected ‘>’ before ‘P’
 template<typename T, A<typename T>::Pointer P>
                                             ^

Что мне делать, чтобы мой код работал? Спасибо!

PS. Приведенный выше код - это просто пример структуры. Я знаю, что сам код бессмыслен.

0
james 13 Мар 2014 в 02:46

2 ответа

Лучший ответ

Вы почти поместили typename в нужное место.

template<typename T, typename A<T>::Pointer P>

Кроме того, Pointer typedef должен быть общедоступным, чтобы это работало.

4
Brian Bi 13 Мар 2014 в 02:50
Спасибо! Не могли бы вы объяснить или дать ссылку о том, почему typename необходимо в этом случае?
 – 
james
13 Мар 2014 в 02:53
fun() также может быть другом A<T>.
 – 
Spencer
5 Дек 2022 в 18:41

Это работает, когда вы исправляете синтаксис и контроль доступа:

template<typename T>
class A
{
public:                                            // must be accessible!
    typedef T* Pointer;
};

template<typename T, typename A<T>::Pointer P>     // like this
T fun()
{
    return *P;
}

int main()
{
    fun<int, (int*)0>();
}
4
Kerrek SB 13 Мар 2014 в 02:51