C++ 如何为非模板类定义模板方法?

C++ 如何为非模板类定义模板方法?,c++,visual-studio,templates,methods,implementation,C++,Visual Studio,Templates,Methods,Implementation,我的编译器对我实现模板方法的方式不满意。它为这些实现提供了大量错误消息,如“未定义的类型T” 这是我的第一个方法,它在类块之外实现: class VectorConvertor { public: // ... template <class T> static void ReverseVectorElements(std::vector<T> & Vector); // ... }; te

我的编译器对我实现模板方法的方式不满意。它为这些实现提供了大量错误消息,如“未定义的类型T”

这是我的第一个方法,它在类块之外实现:

class VectorConvertor
{
    public:
        // ...
        template <class T>
        static void ReverseVectorElements(std::vector<T> & Vector);
        // ...
};

template <class T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    std::vector<T>::size_type size = Vector.size();
    T swap;
    for (std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}
类矢量转换器
{
公众:
// ...
模板
静态无效元素(标准::向量和向量);
// ...
};
模板
void VectorConvertor::ReverseVectorElements(标准::向量和向量)
{
std::vector::size_type size=vector.size();
T互换;
对于(std::vector::size_type i=0;i=static_cast(0))?static_cast(+1):static_cast(-1);
}
// ...
}
我的代码有什么问题吗,或者这只是编译器本身的问题


IDE和编译器:Visual Studio 2010

您缺少了一些
类型名
和分号,但除此之外,代码似乎还可以。我想,如果它仍然不起作用,是时候提交一个bug了


顺便说一句,交换代码最好使用
std::swap

您的代码在VS2005上编译时不会出错(除了ElementaryMath定义末尾缺少分号),因此您可能会看到编译器错误

VS2010 SP1在测试版中提供。可能会有帮助,但显然是它的beta版…

此处键入名称:

template <class T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    typename std::vector<T>::size_type size = Vector.size();
    T swap;
    for (typename std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}
模板
void VectorConvertor::ReverseVectorElements(标准::向量和向量)
{
typename std::vector::size_type size=vector.size();
T互换;

对于(typename std::vector::size_type i=0;i您的代码在我看来还可以。但有一件事我想到了。您能检查一下函数“sign”以前是否定义过吗?只需将鼠标悬停在它上面。C运行时库使用“#define”实现了它的一些函数关键字,因此以后不能定义具有相同名称的函数。

类矢量转换器
class VectorConvertor
{
    public:
    // ...
    template <typename T>
    static void ReverseVectorElements(std::vector<T> & Vector);
};

template <typename T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    std::vector<T>::size_type size = Vector.size();
    T swap;
    for (std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}

int main()
{
    std::vector <int> i(10,0);

    VectorConvertor obj;   // Since your class isn't a template, template parameter
                           // isn't required for a class template instantiation.
                           // However, if your class was a template class, template-
                           // parameter must have been required for a class template
                           // instantiation.

    obj.ReverseVectorElements(i);  // Equal to obj.ReverseVectorElements<int>(i);
                                   // Based on type of i, compiler can instantiate a 
                                   // template function by default.
    getchar();
    return 0;
}
{ 公众: // ... 模板 静态无效元素(标准::向量和向量); }; 模板 void VectorConvertor::ReverseVectorElements(标准::向量和向量) { std::vector::size_type size=vector.size(); T互换;
对于(std::vector::size_type i=0;iIn除了使用std::swap(将用作{using std::swap;swap(a,b);})之外,整个循环可以替换为std::swap_范围(vector.begin(),vector.begin()+vector.size()/2,vector.rbegin())@灰熊如果他只想倒转方向,他可以:reverse@CashCowTyrdSwitter的根源在于标准的C++,现在没有理由使用它。提到“Type NeNEAM”的答案是在讨论依赖类型,而不是模板参数列表。完全错误的答案,但我今天完成了投票。我没有意识到这一点。我已经删除了关于typename的误导性部分。@hkBattousai:winapi中的max和min宏总是令人头疼。有一个特殊的配置宏需要定义(最好在项目设置中定义),以防止winapi创建它们;例如,请参阅。(在你删除你的评论之前,这更有意义,但我把它留在这里,因为我认为它仍然适用。)哦,你说到点子上了,真的。不是函数“sign()”是,而是另一个函数(第一个编译器错误),“max()”定义方式与您所说的相同。我按如下方式取消了定义,现在没有编译器错误。>>
\ifdef max----\unde max----\end
您这样做了吗?(请注意,msvc的某些版本的从属名称错误。)@弗雷德·努克:你的意思是说这是编译器的问题还是我编程的方式错了?请提供信息,说明防止自己再次出错的原因:)两者都有;请参阅我上面给出的链接,并阅读相关名称(在这里和其他地方的其他答案中)。
class VectorConvertor
{
    public:
    // ...
    template <typename T>
    static void ReverseVectorElements(std::vector<T> & Vector);
};

template <typename T>
void VectorConvertor::ReverseVectorElements(std::vector<T> & Vector)
{
    std::vector<T>::size_type size = Vector.size();
    T swap;
    for (std::vector<T>::size_type i=0; i<size/2; i++)
    {
        swap = Vector.at(i);
        Vector.at(i) = Vector.at(size-1-i);
        Vector.at(size-1-i) = swap;
    }
}

int main()
{
    std::vector <int> i(10,0);

    VectorConvertor obj;   // Since your class isn't a template, template parameter
                           // isn't required for a class template instantiation.
                           // However, if your class was a template class, template-
                           // parameter must have been required for a class template
                           // instantiation.

    obj.ReverseVectorElements(i);  // Equal to obj.ReverseVectorElements<int>(i);
                                   // Based on type of i, compiler can instantiate a 
                                   // template function by default.
    getchar();
    return 0;
}