在准备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 *'”
答案 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;