Что случилось, ребята,
Я пытаюсь перегрузить оператор сложения для моего математического векторного класса.
Мой (на первый взгляд логически правильный) упрощенный код:
template<typename T>
class Vector2
{
private:
T m_data[2];
template<typename U>
friend auto operator+(Vector2<T> a, Vector2<U> b) -> Vector2<decltype(a.m_data[0] + b.m_data[0])>
{
Vector2<decltype(a.m_data[0] + b.m_data[0])> ret( a.m_data[0] + b.m_data[0],
a.m_data[1] + b.m_data[1] );
return ret;
}
public:
inline Vector2(T x, T y)
{
m_data[0] = x;
m_data[1] = y;
}
};
int main()
{
Vector2<float> v1(0.5f, 0.5f);
Vector2<float> v2(1, 2);
v2 + v1; // Line 29
return 0;
}
Однако, GCC 4.6.1 дал мне это:
W:\projects\Awesome\BetterStuff\main.cpp||In function 'Vector2<decltype ((a.m_data[0] + b.m_data[0]))> operator+(Vector2<T>, Vector2<U>) [with U = float; T = float; decltype ((a.m_data[0] + b.m_data[0])) = float]':|
W:\projects\Awesome\BetterStuff\main.cpp|5|error: 'float Vector2<float>::m_data [2]' is private|
W:\projects\Awesome\BetterStuff\main.cpp|29|error: within this context|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|
И если бы я изменил второй вектор на вектор int, это дало бы мне больше (похожих) ошибок.
Самое близкое, к чему я пришел, это найти эту интересную страницу: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48884
Но, к сожалению, я не смог использовать это для решения своей проблемы.
Я пробовал GCC 4.6.2 и 4.7.0, но мой код тоже не компилировался.
Изменение «private» на «public» действительно решает мою проблему, но, очевидно, я не намерен выставлять m_data;
Я просто хочу определить оператор сложения, чтобы его тип возвращаемого значения определялся параметрами шаблона, что, как я понимаю, является временем компиляции - для каждого экземпляра функции шаблона компилятор автоматически вычисляет тип возвращаемого значения на основе на decltype () есть. Я имею в виду, каким образом main () пытается получить доступ к содержимому m_data для одного из этих векторов?
Все это смущает меня, любая помощь будет принята с благодарностью.
ОК, спасибо