找不到c ++模板运算符

时间:2015-01-19 17:43:27

标签: c++ templates

好的,关于c ++模板的新问题......

我正在为2d / 3d / 4d向量编写模板类(如在几何向量中,而不是数组)。 一切都很好,经过SO中的一系列问题,但现在由于某种原因找不到运营商。 如果我在类中声明它们,那没关系,但是如果我在外部声明它们作为模板,则找不到它们。 有趣的是,如果我用正确的变量类型专门声明它们,那么一切都很好。因此,基本上似乎函数模板从未实例化。

所以,错误是:

error: no match for ‘operator-’ (operand types are ‘Math::TVector<int, 3ul>’ and ‘Math::TVector<int, 3ul>’)

即使它有一个功能:

template <typename Type, unsigned TemplateElementCount>
Math::TVector <Type,TemplateElementCount> operator - ( Math::TVector <Type,TemplateElementCount> &First, Math::TVector <Type,TemplateElementCount> &Second )
{
Math::TVector <Type,TemplateElementCount> Result;
for ( unsigned cont = 0; cont < TemplateElementCount; ++cont )
    Result.Data[cont] = First.Data[cont] - Second.Data[cont];
return Result;
}

http://goo.gl/qrZaU1提供了代码示例 我已经尝试在命名空间内声明它,在它之外,在它之外以完整的分辨率(包括Math ::无处不在)并且没有任何作用。 任何人都可以帮我一把吗? 感谢

编辑: 完全编译错误是

main.cpp: In function 'int main(int, char**)':                                                                                  
main.cpp:16:23: error: no match for 'operator-' (operand types are 'Math::TVector<int, 3ul>' and 'Math::TVector<int, 3ul>')     
 Vector1 = Vector1 - Vector2;                                                                                               
                   ^                                                                                                        
main.cpp:16:23: note: candidate is:                                                                                             
In file included from main.cpp:2:0:                                                                                             
Point.h:171:43: note: template<class Type, unsigned int TemplateElementCount> Math::TVector<Type, TemplateElementCount> operator
-(Math::TVector<Type, TemplateElementCount>&, Math::TVector<Type, TemplateElementCount>&)                                       
 Math::TVector <Type,TemplateElementCount> operator - ( Math::TVector <Type,TemplateElementCount> &First, Math::TVector <Type,Te
mplateElementCount> &Second )                                                                                                   
                                       ^                                                                                    
Point.h:171:43: note:   template argument deduction/substitution failed:                                                        
main.cpp:16:25: note:   mismatched types 'unsigned int' and '#'integer_cst' not supported by dump_type#<type error>'            
 Vector1 = Vector1 - Vector2;                                                                                               
                     ^                                                                                                      
main.cpp:16:25: note:   'Math::TVector<int, 3ul>' is not derived from 'Math::TVector<Type, TemplateElementCount>' 

1 个答案:

答案 0 :(得分:2)

问题(或者至少是其中一个问题)似乎是您使用unsigned作为operator -的第二个非类型模板参数的类型,而类{{ 1}}使用类型为TVector的相应非类型模板参数进行实例化。这两种类型不一定相同(根据您收到的编译器错误,似乎std::size_t解析为您平台上的std::size_t),因此错误。

如下更改功能的签名应解决问题:

unsigned long