2013-03-04 3 views
1

Я хочу перегрузить оператор преобразования для двух шаблонов.оператор преобразования шаблона

хиджры

#pragma once 

#include <B.h> 

template <typename T> class A 
{ 
operator B<T>() const; 
} 

B.h

#pragma once 

#include <A.h> 

template <typename T> class B 
{ 
operator A<T>() const; 
} 

я получил ошибку

error C2833: 'operator A' is not a recognized operator or type see 
reference to class template instantiation 'B<T>' being compiled 

Хотя это работает, если оператор преобразования перегружается только в одном шаблоне.

+0

Какой компилятор вы используете? –

+1

Возможно [это] (http://stackoverflow.com/questions/14909997/why-arent-my-include-guards-preventing-recursive-inclusion-and-multiple-symbol) может помочь ('#pragma once' в основном работает в качестве охранника) –

ответ

2

У вас есть проблема с циклической зависимостью. Вы должны иметь опережающее объявление, например:

хиджры:

#pragma once 

template <class T> class B; 

template <class T> class A { 
    operator B<T>() const; 
}; 

#include "B.h" 

template <class T> 
A<T>::operator B<T>() const { 
    foo(); 
} 

B.h:

#pragma once 
#include "A.h" 

template <class T> 
class B { 
    operator A<T>() const { 
     bar(); 
    } 
}; 

Я предполагаю, что вы использовали #include "A.h". A.h затем включал B.h. Когда компилятор начал компилировать B.h, он еще не видел объявления для A.h, и, следовательно, компилятор не знал, как интерпретировать operator A<T>() const, так как он не знает, что A является типом.

+0

Благодарим за ответ. Как-то он просто работает с шаблоном класс A; 'в B.h и' template класс B; 'в A.h без каких-либо включений. Компилятор - Visual Studio 2010 – Demion

+0

Да. Он будет работать - ответ, который я дал, касается случаев, когда реализация 'A :: operator B ()' не может компилироваться без видимой реализации класса 'B '. Таким образом, обе реализации могут видеть полное определение каждого класса. Просто имейте в виду, что в этом шаблоне 'B ' может быть членом типа 'A ', но 'A ' may * not * имеет член типа 'B ' (но может иметь член указателя типа или ссылаться на «B »). –

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