Я пытаюсь определить функцию шаблона, у которой есть параметр типа и параметр, не являющийся типом. Однако тип параметра, не являющегося типом, зависит от параметра типа. Это выглядит так:
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. Приведенный выше код - это просто пример структуры. Я знаю, что сам код бессмыслен.
2 ответа
Вы почти поместили typename
в нужное место.
template<typename T, typename A<T>::Pointer P>
Кроме того, Pointer
typedef
должен быть общедоступным, чтобы это работало.
Это работает, когда вы исправляете синтаксис и контроль доступа:
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>();
}
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
typename
необходимо в этом случае?fun()
также может быть другомA<T>
.