Я пытаюсь реализовать универсальный метод для помещения в класс вычисляемого значения в качестве значения памяти только для чтения.
Я успешно выполнил его, используя следующий макрос:
#define READONLY_PROPERTY(datatype, containerclass, access, name)\
class name ## _ ## datatype ## _ROP {\
public:\
name ## _ ## datatype ## _ROP(containerclass &c_): cclass(c_) {}\
operator datatype() const {return cclass.access();}\
private:\
containerclass &cclass;\
}name;\
friend class name ## _ ## datatype ## _ROP
которые используются в этом классе:
class TestClass {
public:
TestClass(): x(0), y(0), pixels(*this) {}
TestClass(int x_, int y_): x(x_), y(y_), pixels(*this) {}
int x;
int y;
READONLY_PROPERTY(int, TestClass, getPix, pixels);
private:
int getPix() {return x * y;}
};
генерирует следующий рабочий код (используя g ++):
class TestClass {
public:
TestClass(): x(0), y(0), pixels(*this) {}
TestClass(int x_, int y_): x(x_), y(y_), pixels(*this) {}
int x;
int y;
class pixels_int_ROP {
public:
class pixels_int_ROP(TestClass &c_): cclass(C_) {}
operator int() const {return cclass.getPix();}
private:
TestClass &cclass;
} pixels;
friend class pixels_int_ROP;
private:
int getPix() {return x * y;}
};
Дело в том, что я могу использовать класс таким образом:
TestClass tc(10,10);
std::cout << tc.pixels << std::endl;
Теперь я пытаюсь сделать то же самое с использованием шаблонов на C ++:
template<class T, class U, U (T::*F)()>;
class ReadOnlyProperty {
public:
ReadOnlyProperty(T const& instance): _instance(instance) {}
operator U const &() const {return _instance.*F();}
private:
T& _instance;
};
class TestClass {
public:
TestClass(): x(0), y(0), pixels(*this) {}
TestClass(int x_, int y_): x(x_), y(y_), pixels(*this) {}
int x;
int y;
ReadOnlyProperty<TestClass, int, &TestClass::getPix&> pixels;
private:
int getPix() {return x * y;}
};
но компилятор говорит:
error: incomplete type ‘TestClass’ used in nested name specifier <br>
error: template argument 3 is invalid
в строке, где создается экземпляр класса шаблона.
Не могли бы вы мне помочь?
Заранее спасибо.