在c ++中,如何创建从T到T *的转换?

时间:2010-03-06 13:23:24

标签: c++ templates

在准备OOP考试时,我很高兴看到g ++编译下面的代码(没有实例化),即使它似乎毫无意义:

template<class T> void f() {
    T t = "a";
    t += 5.6;
    t->b();
    T* p = t;
    p = p*(t/"string");
}

然后我开始尝试进行实例化和编译。

我创建了以下类:

class A {
    public:
    A(const char* s) {}
    void operator+=(double d) {}
    A operator/(char* str) {return A("");}
    A* operator->() {return this;}
    A* operator=(A& a) {return &a;}
    void b() {}
};
A* operator*(A* a, A b) {return new A("");}

允许几乎所有模板都可以工作,除了行

T* p = t;

我的问题是,什么运算符或构造函数将使这一行工作?目前它给我“错误:在初始化中无法将'A'转换为'A *'”

5 个答案:

答案 0 :(得分:7)

使用类型转换运算符?

class A {
   //...
public:
    template< class T > 
    operator T*() { return this; }
};

但显然,这是不好的做法。

答案 1 :(得分:3)

这是一条毫无意义的界限。

但为了使其可编辑,您可以提供转换运算符:

operator A* () { return 0; }

希望你意识到这是多么邪恶。

答案 2 :(得分:2)

虽然Klaim告诉你如何,对T指针的隐式转换可能会导致漏洞 - 所以请不要在生产代码中这样做。
通过&运算符明确地获取地址可以避免这些错误,并更清楚地说出您的意图。

另请注意,您的赋值运算符看起来,让我们说不寻常。有关详细信息,请参阅C++ FAQ lite entry

答案 3 :(得分:1)

class A {
  // ...
  template <typename T>
  operator T*() const
  {
    // ...
  }
  // ...
};

答案 4 :(得分:0)

我的C / C ++非常生疏,但我真的想说它只是

T* p = &t;