Если вы хотите вернуться по ref, то ваши функции A :: getValX () также должны возвращаться по ref, и ваша переменная res
внутри оператора B :: также должна быть T & вместо T:
#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 нигде не инициализируется.)
Ваш исходный код возвращает ссылку на локальную переменную res, а не на A :: val1 / A:: val2, как вы, вероятно, намеревались.Если res - нереферентная переменная, то это будет простая копия значения val1 / val2, которая действительна только внутри области (в данном случае функции), где она была объявлена.Так что вам нужна ссылка здесь.