Функция-член C ++ Pointer с назначением шаблонов с функцией-членом другого класса - PullRequest
0 голосов
/ 26 марта 2010
class IShaderParam{
 public:
 std::string name_value;
};

template<class TParam>
class TShaderParam:public IShaderParam{

public:
 void (TShaderParam::*send_to_shader)( const TParam&,const std::string&);
 TShaderParam():send_to_shader(NULL){}
 TParam value;
 void up_to_shader();
};
typedef TShaderParam<float> FloatShaderParam;
typedef TShaderParam<D3DXVECTOR3> Vec3ShaderParam;

В другом классе у меня есть вектор IShaderParams * и функции, которые я хочу отправить в send_to_shader. Я пытаюсь назначить ссылку на эти функции следующим образом:

Vec3ShaderParam *_param = new Vec3ShaderParam;
_param->send_to_shader = &TShader::setVector3;

Это функция:

void TShader::setVector3(const D3DXVECTOR3 &vec, const std::string &name){

 //...
}

А это класс с IshaderParams *:

class TShader{

 std::vector<IShaderParam*> params;

public:
 Shader effect;
 std::string technique_name;

 TShader(std::string& afilename):effect(NULL){};
 ~TShader();
 void setVector3(const D3DXVECTOR3 &vec, const std::string &name);

Когда я компилирую проект с помощью Visual Studio C ++ Express 2008, я получаю эту ошибку:

Ошибка 2, ошибка C2440: '=': невозможно преобразование 'void (__thiscall TShader :: *) (const D3DXVECTOR3 &, const std :: string &) 'a' void (__thiscall TShaderParam :: *) (const TParam &, const std :: string &) ' C: \ Users \ Исагор \ документы \ MCV \ afoc \ shader.cpp 127

Могу ли я выполнить задание? Нет? Я не знаю как Да, я знаю, что могу достичь той же цели с помощью других методов, но я хочу знать, как я могу это сделать ..

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

Это потому, что вы пытаетесь использовать несовместимые указатели. setVector3 - это метод TShader, но send_to_shader хочет метод TShaderParam.

Не зная точно, что вы хотите, вы можете компилировать свой пример, изменив это:

void (TShaderParam::*send_to_shader)( const TParam&,const std::string&);

к этому:

void (TShader::*send_to_shader)( const TParam&,const std::string&);
1 голос
/ 26 марта 2010

Предположительно TShader::send_to_shader это указатель на функцию в стиле c?

Функции-члены нельзя использовать в качестве обратных вызовов указателя функции - для них требуется параметр this.

Статические функции-члены и глобальные функции могут использоваться в качестве указателей на функции.

Так что вы можете либо

  1. передает this вручную в качестве параметра для статического обратного вызова функции, который, в свою очередь, вызывает функцию-член в соответствующем экземпляре

  2. использовать интерфейс вместо функции

  3. использовать функтор

Все три требуют небольших архитектурных изменений.

0 голосов
/ 26 марта 2010

Указатели на функции-члены немного жесткие.Было бы полезно, если бы вы показали нам строку кода, которая генерирует ошибку, но просто посмотрите на нее:

Error 2 error C2440: '=' :can't make the conversion 'void (__thiscall TShader::* )(const D3DXVECTOR3 &,const std::string &)' a 'void (__thiscall TShaderParam::* )(const TParam &,const std::string &)' c:\users\isagoras\documents\mcv\afoc\shader.cpp 127

Итак, вы передали void (TShader::* )(const D3DXVECTOR3 &,const std::string &) но кто-то ожидает void (TShaderParam::* )(const TParam &,const std::string &).

Вам необходимо переопределить setVector3 как метод типа, производного от TShaderParam, и извлечь ваш D3DXVECTOR3 & из первого аргумента, который должен быть TParam.(Но если он просто возвращает ваше собственное значение, вы можете static_cast передать его вашему собственному типу, производному от TParam.)

Надеюсь, это поможет!

...