模板参数=void*的编译器错误

 

编译器错误。 Bild 1961,64位。

template<typename T>
class A
{ 
};

A<void*> a;  // '<' - cannot to apply function
 
以前有可能吗?
 
我将在晚上与C++一起检查这个公告
 
Vladimir Simakov:
以前有可能吗?

是的,我特别在旧版本(1554)上检查了它 - 一切正常。

我今晚会用C++中的这种公告来检查它。

嗯,那里肯定没问题。 有什么理由可能不工作吗?
 
Alexey Navoykov:

请举出一个使用这种结构的例子。

 
fxsaber:

请举例说明如何使用这一结构。

最微不足道的例子是一个数组类。 在这种情况下,它被用来存储任何指针。

template<typename T>
class CArray
{
  T _data[]; 
 public:
  T operator[](int i) const { return _data[i]; }
  int Size()          const { return ArraySize(_data); }
  // и т.д.
};

СArray<void*> pointers;
 
Alexey Navoykov:

最微不足道的例子是数组类。 在这种情况下,它被用来存储任何指针。

那么如何使用它呢?

class A
{
public:
  void OnInit()
  {
    Print(__FUNCSIG__);
  }
};

class B
{
public:
  void OnInit()
  {
    Print(__FUNCSIG__);
  }
};

void OnStart()
{    
  void* Pointers[2];

  A a;
  B b;
  
  Pointers[0] = &a;
  Pointers[1] = &b;
  
  for (int i = 0; i < ArraySize(Pointers); i++)
    Pointers[i].OnInit(); // 'OnInit' - member function not defined
}
 
fxsaber:

那么如何使用它呢?

就像CObject 在元引号容器中的使用方式一样。 你投到你最初放在那里的类型(或者用dynamic_cast检查)。 听到你这么问,我有点吃惊。
 
Alexey Navoykov:
铸成你最初放在那里的类型(或通过dynamic_cast检查)。
//    (A*)Pointers[i].OnInit();
    ((A*)Pointers[i]).OnInit();

这只是关于括号是否有必要/无必要的问题...有了这个铸造,在上面的脚本中,执行起来就会很扫兴。也就是说,你需要知道数组指针元素所指向的类的名称。

我不明白那有什么方便。


MQ只在一个地方使用void*。

typedef string(*DoubleToStringFunction)(double,void*);
 
fxsaber:

MQ只在一个地方使用void*。

因为他们的一切都建立在CObject 上,这使得他们的容器无法用于自己的类和接口,而不是从他们的类中继承。 即不是一个通用的解决方案。

但另一方面,他们的对象本身也参与了一些操作(改变其中指针的值),这本身就很疯狂。

 
Alexey Navoykov:

这使得他们的容器无法用于自己的类和不从其类继承的接口,即不是一个通用的解决方案。

也许这是因为在他们的库被创建时,MQL中还没有void*。

不幸的是,我还没有看到它的使用实例。