2

我正在尝试让 tvmet 与 VS2010 一起使用。我已经下载了 TvMet 源 ( http://tvmet.sourceforge.net/ ),在我的项目设置中包含了包含目录。然后我写

#include <tvmet/Matrix.h>

using namespace tvmet;

但我得到编译错误说 config.h 丢失。没关系。所以我从config文件夹复制config-vc71.h到tvmet目录config.h,但是我得到了错误

"Error  25  error C2244: 'tvmet::CommaInitializer<Obj,LEN>::operator ,' : unable to match function definition to an existing declaration"

这个错误是什么意思,我该如何解决?

4

2 回答 2

3

在 CommaInitializer.h 中,内联实现

Initializer<value_type, 2> operator,(value_type rhs);

template<class Obj, std::size_t LEN>
typename CommaInitializer<Obj, LEN>::template Initializer<typename Obj::value_type, 2>
CommaInitializer<Obj, LEN>::operator,(typename Obj::value_type rhs)
{
   m_wipeout_on_destruct = false;
   iterator iter1 = m_object.data();
   *iter1         = m_data;
   iterator iter2 = iter1 + 1;
   *iter2         = rhs;
   return Initializer<value_type, 2>(iter2 + 1);
 }

Initializer<value_type, 2> operator,(value_type rhs)
{
 m_wipeout_on_destruct = false;
 iterator iter1 = m_object.data();
 *iter1         = m_data;
 iterator iter2 = iter1 + 1;
 *iter2         = rhs;
 return Initializer<value_type, 2>(iter2 + 1);
}

VS 不喜欢函数定义中的 ::template 关键字。如果您删除 ::template 关键字,您将破坏 gcc :( 但如果您内联实现,它应该可以正常工作。

希望能帮助到你

于 2013-06-20T17:31:27.253 回答
0

以下行尝试声明重载的逗号“,”运算符函数

Initializer<value_type, 2> operator,(value_type rhs);

但是 VC++ 无法将函数定义与其声明相匹配。所以我注释掉了上面的行,而是添加了下面的函数声明

typename CommaInitializer<Obj, LEN>::template Initializer<typename Obj::value_type, 2>
  CommaInitializer<Obj, LEN>::operator,(typename Obj::value_type rhs);
于 2016-08-11T06:31:33.380 回答