2014-07-13 199 views
0

我是C++新手。我有下面的C++代码:C++泛型实例化

template <typename T, int length> 
class Vector 
{ 
    public: 
     Vector(T values[length]) 
     { 
      for (int i = 0; i < length; i++) 
      list[i] = values[i]; 
     } 
     friend bool operator<(const Vector<T, length>& left, 
      const Vector<T, length>& right) 
     { 
      bool result = true; 
      for (int i = 0; i < length; i++) 
      result &= left.list[i] < right.list[i]; 
      return result; 
     } 
    private: 
    T list[length]; 
    }; 


    int main() 
    { 
     int first[] = {1, 2}, second[] = {2, 3}; 
     Vector<int, 2> vector1(first), vector2(second); 
     cout << (vector1 < vector2) << endl; 
     return 0; 
    } 

我试图编译它VC下++速成2010年。它返回以下错误消息有以下两个行:

for (int i = 0; i < length; i++) 
result &= left.list[i] < right.list[i]; 

当我把光标放在“长度”,它报告标识符‘长度’是未定义

当我把光标放在‘左’,它返回表达式必须具有算术,枚举或指针类型

瓦时我将光标放在“list”上,它返回成员“Vector :: list is accessiblecessible。

任何人都可以提供一些帮助,并告诉我如何更正代码?非常感谢。

编辑:非常感谢。我已经解决了这个问题。看来VS 2010不起作用。我升级到2013版。现在它工作正常。在这里,我还有一个关于泛型类型实现的问题。我有以下类:

class Int 
{ 
public: 
    Int(int i = 0) {this->i = i;} 
private: 
    int i; 
}; 

我想实现这样的主要功能这个类:

int main() 
{ 
    Int first[] = {Int(1), Int(2)}, second[] = {Int(2), Int(3)}; 
    Vector<Int, 2> vector1(first), vector2(second); 
    cout << (vector1 < vector2) << endl; 
    return 0; 
} 

它仍然不能编译。我猜在类Int中有什么问题。任何人都可以帮忙吗?非常感谢。

+0

Friend函数不会继承模板参数。 – chris

+0

@chris不正确。这与最近的clang ++和g ++编译得很好。在类定义中定义好友函数时,您可以访问类作用域的名称。 – dyp

+0

*“当我把光标放在”*那么这些智能错误?当你编译它时,编译器的输出是什么? – dyp

回答

0

此错误可能是一个编译器问题。

您的代码看起来编译OK具有更近的编译器,如GCC-4.8.1,使用类似

g++ -std=c++11 test.cpp 

GCC编译器的Windows可以从http://mingw.org/下载,并配备了大多数Linux发行版。我没有试过VS2013。一般来说,MinGW和clang都有更好的C++标准支持。

+0

OP没有在任何地方使用可变参数模板,从描述来看,它们甚至不清楚它们是否只是Intellisense错误或编译器错误。 – Praetorian

+0

你是对的可变因素。什么是这个int模板然后调用?显然,VS2010在这里不支持这个模板特性,这是问题的原因。 – tinlyx

+0

这是一个非类型的模板参数,我非常怀疑VS2010不支持它。 – Praetorian