2016-09-28 3 views
0

Это вопрос, чтобы увидеть пределы языка C++.с использованием typedef из другого класса круговым способом

Большинство круговых зависимостей классов могут быть решены с помощью деклараций и указателей вперед.

Но мне интересно, если это может быть как-то решать:

struct Y; // forward declaring Y does not solve the problem 

struct X { 
    using T = int; 
    using Other = Y::T; //error: incomplete type 'Y' named in nested name specifier 
}; 

struct Y { 
    using T = float; 
    using Other = X::T; 
}; 

Синтаксический его человеческим глазом, вы можете легко увидеть, что в этом коде X::Other может тривиальным понимать как float, потому что Y::T не зависит ни от чего , Однако я не знаю ни одного синтаксиса, который позволил бы «переслать объявление typedef», что-то вроде typename Y::T = float; (но всегда есть неисследованные темные углы C++) или любой метод или идиома, которые позволили бы использовать вышеуказанные typedefs.

. Есть ли способ решить проблему выше? (в частности: каждый класс использует typedef другого класса - не перемещая typedef вне класса)

ответ

1

Вы можете сделать X структурой шаблона. Что-то вроде этого.

template <typename YType> 
struct X { 
    using T = int; 
    using Other = typename YType::T; 
}; 

struct Y { 
    using T = float; 
    using Other = X<Y>::T; 
}; 

int main() 
{ 
    X<Y> x; 
} 

Это не идеальное решение, но если у вас есть угловые случаи, как это, иногда вам нужно сделать хаки.

+0

Да, это то, о чем я думал. Любопытно, существуют ли другие решения. – bolov