模板转换运算符

时间:2013-03-04 18:13:26

标签: c++ templates operator-overloading

我想为两个模板重载转换运算符。

A.H

#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

虽然只有在一个模板中重载转换运算符才有效。

1 个答案:

答案 0 :(得分:2)

您有循环依赖问题。您需要有一个前向声明,例如:

A.H:

#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"。然后包括B.h.当编译器开始编译B.h时,它还没有看到A.h的声明,因此编译器不知道如何解释operator A<T>() const,因为它不知道A是一个类型。