Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, w40, Вы писали:
w40>>вот код:
U>сделал минимальные изменения, которые доводят ваш код до компилябельного состояния: http://ideone.com/RtxTa
U>подозреваю, что ваша проблема сосредоточена здесь:
U>U>class F{
U>public:
U> template<class T>
U> int func(T::B& a){return 0;}
U>};
U>int main()
U>{
U> A<C>::B a;
U> F f;
U> int rc = f.func(a);
U> return 0;
U>}
U>
U>компилятор не может вывести тип T, когда в функцию func передают переменную типа T::B
U>такие ограничения на вывод типа при статическом полиморфизме
U>можно почитать виды полиморфизма здесь: http://fprog.ru/2010/issue4/roman-dushkin-existentials/
U>к сожалению, не могу сказать точно, какой вид полиморфизма вы пытаетесь использовать =\
U>можно спросить в разделе "Функциональное программирование"
в следующем виде компиляется под 2005ым:
struct XXX
{
int a,b,c;
};
class C{
public:
typedef XXX B;
};
template<class T>
class A{
public:
typedef typename T::B B;
};
typedef A<C> AC;
class F{
public:
template<class T>
int func(typename T::B& a){return 0;}
};
int main(int argc, char* argv[])
{
AC::B a;
F f;
int rc = f.func<AC>(a);
return 0;
}
но вот на 6-ом
int rc = f.func<AC>(a);
даёт:
error C2275: 'AC' : illegal use of this type as an expression
выходит, что в 6-ом (класс-)функции нельзя явно указать аргумент темплэйта