【发布时间】:2011-10-03 08:02:06
【问题描述】:
以下代码可在 clang++-2.9 和 g++-4.6 上编译(无警告)。但是,g++ 二进制文件 Seg Faults,而 clang++ 二进制文件按预期运行。
重载[]时通过指针访问模板类数据成员的正确方法是什么?
代码如下:
#include <iostream>
template <typename T>
class A {
private:
T val1;
T val2;
public:
T& getVal1() { return val1; }
void setVal1(T aVal) { val1 = aVal; }
T& getVal2() { return val2; }
void setVal2(T aVal) { val2 = aVal; }
};
template <typename T>
class B {
private:
A<T>* aPtr;
public:
A<T>* getAPtr() { return aPtr; }
T& operator[](const int& key) {
if(key == 0) { T& res = getAPtr()->getVal1();
return res; }
else { T& res = getAPtr()->getVal2();
return res; }
}
};
int main()
{
B<int> foo;
foo[0] = 1;
int x = foo[0];
std::cout << foo[0] << " " << x << std::endl; // 1 1
}
【问题讨论】:
-
aPtr未初始化,因此取消引用它是未定义的行为。
标签: c++ templates pointers operator-overloading