【问题标题】:C++ template errors with implementation in CPP file (Visual Studio)在 CPP 文件 (Visual Studio) 中实现的 C++ 模板错误
【发布时间】:2015-02-03 18:24:20
【问题描述】:

我在头文件中声明了一个 C++ 类定义,如下所示:

template <class T>
class MyClass : public T
{

public:

    STDMETHODIMP myMethod();

};

.cpp 中的实现是这样的:

template <class T>
STDMETHODIMP MyClass<T>::myMethod() {
// Implementation...
}

编译器 (Visual Studio) 抱怨方法实现,说“使用过时的错误:忽略数据的修饰符”以及“无法识别的模板声明/定义”。

有什么想法吗?

编辑:

错误可能在这里吗?

我正在尝试扩展 MyClass,所以我声明

class ChildClass : MyClass<SomeConcreteClass>
{
// Stuff...
};

【问题讨论】:

  • 如果你想保持你的标题干净,你可以将它写入一个.inl文件,并在你的标题末尾简单地包含“.inl”

标签: c++ windows visual-studio templates inheritance


【解决方案1】:
  1. 模板函数的定义也必须在头文件中。 (此规则的唯一例外是模板仅在一个编译单元中实例化;在这种情况下,您可以将定义放在同一源中。)。因此,将实现移出.cpp 并移到标题中。

  2. 你在类声明中写的STDMETHODIMP 看起来也很可疑(并且可能是直接错误的来源)。你确定没有像STDMETHOD 这样的宏你应该在那里使用吗?

【讨论】:

  • 这不是唯一的例外,您还可以在标头中显式实例化,然后在 cpp 文件中定义实现。但这就像一个没有人使用过的超级边缘案例。
  • STDMETHOD 包括“虚拟”,与 STDMETHODIMP 的唯一区别是我应该使用它吗?顺便说一下,这是一个 COM 类。即使将 impl 移到标题中,我仍然会收到“未命名的类模板”
  • 现在,在类声明中使用 STDMETHOD 并在其中包含函数的定义。修复编译错误,验证运行时,然后分离出实现。
  • 问题可能出在其他地方吗?如果我要扩展 MyClass,可以吗: class My2ndClass : public MyClass
猜你喜欢
  • 2014-06-25
  • 2013-06-14
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2014-06-20
  • 2016-08-05
相关资源
最近更新 更多