Вот краткий обзор моей проблемы:
У меня есть шаблонный класс под названием TWMatrix. Я перегружен оператор (), так что он может взять пару TWMatrix и извлечь соответствующие записи. Я хочу, чтобы «извлечение» дало 2 разных результата для 2 разных случаев. Раньше это работало, когда брал пару целых, но я очень застрял, заставляя его работать для этой немного другой проблемы:
- В одном случае я хочу, чтобы оператор скопировал записи в другой TWMatrix и вывел его.
- В другом случае я хочу, чтобы оператор скопировал адреса этих записей в объект типа TWDataPointer, вывел этот объект.
В первом случае метод не нарушает константность. Действительно, сами записи не являются ни измененными, ни уязвимыми для будущих изменений. В последнем весь смысл в том, что объект TWDataPointer может использоваться для изменения этих элементов матрицы. И поэтому соответствующий бит кода:
TWDataPointer<T> operator () (const TWMatrix<int> & I1, const TWMatrix<int> & I2)
{
return TWDataPointer<T>(*this,I1,I2);
}
TWMatrix<T> operator () (const TWMatrix<int> & I1, const TWMatrix<int> & I2) const
{
return SubMat(I1,I2);
}
SubMat - это метод, который создает матрицу с соответствующими записями. Он работает просто отлично, и какие значения он выбирает, здесь не очень важно. Проблема в том, что этот второй оператор, кажется, никогда не вызывается. Так, например, если в моем основном я пишу:
TWMatrix<double> test = D5(I1,I2);
Компилятор жалуется, говоря:
error: conversion from ‘TWDataPointer<double>’ to non-scalar type ‘TWMatrix<double>’ requested
Это очень непохоже:
T operator () (const int & i, const int & j) const
{
return data[j+i*nc];
}
T& operator () (const int & i, const int & j)
{
return data[j+i*nc];
}
, который работает точно так, как ожидалось, и возвращает либо T, либо T & в зависимости от ситуации. Из того, что я понимаю о перегрузке операторов, именно const позволяет компилятору различать, в какой ситуации использовать. Так почему же это не сработает?
Заранее благодарим за помощь и не стесняйтесь спрашивать о любых дополнительных фрагментах кода, которые могут вам понадобиться.
PS: У меня уже есть решение для этого, и хотя оно не очень уродливо, оно далеко не так просто, элегантно и надежно, как если бы я мог заставить его работать.
edit: Спасибо за помощь, и я все еще жду ваших ответов. В частности, я до сих пор запутался в этом:
"Возвращаясь к примеру с int, почему a = test (0,0) использует версию const соответствующего оператора, даже если test не объявлен как const? Действительно, я проверял, что это так, используя cout операторы в обеих версиях операторов (). "