2016-08-18 5 views
1

Я пытаюсь создать экземпляр шаблонного шаблона на основе типа шаблона другого класса. Но я получаю следующую ошибку.Как объявить класс по типу другого класса

error: template argument 1 is invalid

Вот минимальный пример для воспроизведения ошибки

template <typename IdType> 
class GraphNode 
{ 
    IdType id; 
}; 

template <typename IdType> 
class Graph 
{ 
public: 
    using NodeType = IdType; 

    GraphNode<IdType> nodes[100]; 
}; 

template <typename IdType> 
class ProcessGraph 
{ 
    //some functions 
}; 

template <typename IdType> 
auto create_graph() 
{ 
    Graph<IdType> graph; 
    // populate graph here 
    return graph; 
} 

int main(int argc, char *argv[]) 
{ 
    if(atoi(argv[1])) 
     const auto &graph = create_graph<int>(); 
    else 
     const auto &graph = create_graph<unsigned long>(); 

    auto processor = ProcessGraph<typename graph.NodeType>(); // The error occurs here 
    return 0; 
} 

Спасибо за помощь

ответ

3

Есть две проблемы в вашем коде:

  1. переменная имеет различный тип в ветвях, и это выходит за рамки при объявлении processor.

  2. Синтаксис для доступа к псевдониму внутреннего типа неверен.


Вы можете получить тип переменной x с помощью decltype(x). Поскольку является ссылкой, вам необходимо удалить ссылку, используя std::remove_reference_t. Впоследствии вы можете использовать ::NodeType для извлечения внутреннего псевдонима типа.

if(atoi(argv[1])) 
{ 
    const auto &graph = create_graph<int>(); 
    auto processor = ProcessGraph< 
     std::remove_reference_t<decltype(graph)>::NodeType>(); 
} 
else 
{ 
    const auto &graph = create_graph<unsigned long>(); 
    auto processor = ProcessGraph< 
     std::remove_reference_t<decltype(graph)>::NodeType>(); 
} 

Если вы хотите, чтобы реорганизовать код, чтобы избежать повторений, поместите код, который инициализирует processor переменные в template функции, которая получает в качестве параметра (или что создает в своем теле с определенным пользователем type).

+0

Спасибо. Проблема 1 была создана при создании минимального примера. Я думаю, что ошибка была со вторым пунктом – knightrider

+0

@TartanLlama: хорошая точка, обновляющая ответ –

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