无法为向量和抽象类特化模板函数

unable to specialize template function for both vector and abstract class

本文关键字:函数 抽象类 向量      更新时间:2023-10-16

我试图写一个模板函数,但我有麻烦专门化它为vector<>和另一个类在同一时间。下面是我使用的代码:

// template definition
template< class T >
void f( const T& value) 
{
    cout << "DEFAULT" << endl;
}
// specialization for MyClass
template< class T >
void f<>  ( const MyClass & value )
{
    cout << "MyClass" << endl;
}
// specialization for vector
template< class T >
void f<>( const std::vector<T> & v )
{
    cout << "vector" << endl;
}

MyClassMyClass2定义为:

class MyClass{
virtual void a() = 0;
};
class MyClass2 : public MyClass{
    void a(){}
};

最后main函数:

int main(int nArgs, char *vArgs[]){
    MyClass2 e;
    f<MyClass>(e);
}

这是我得到的错误,当我尝试使用Visual Studio 2010编译它:

c:program files (x86)microsoft visual studio 10.0vcincludevector(869):错误C2259: 'MyClass':无法实例化抽象类

这似乎是非常具体到这个特定的情况:只要我去除const修饰剂,我把vector变成list或我使MyClass具体化,一切工作。但是对于我的问题,我需要这种特殊的情况。

是否有人有和我一样的错误,更重要的是,有人知道修复/解决这个问题吗?

我相信:

// specialization for vector
template< class T >
void f<>( const std::vector<T> & v )
{
    cout << "vector" << endl;
}

是不可能的(即使你的语法被纠正了,正如Anton在他的回答中所做的那样),因为它不是f的完全专门化(有未绑定的类型参数)。部分函数专门化在c++标准下是不允许的。

关于Stack Overflow还有一些其他问题,涉及类似的代码和类似的问题。这个问题(以及获胜的答案)似乎非常相关:为什么函数模板不能部分专门化?

你可以自己阅读c++标准,如果你觉得特别受虐的话。您可以从本文档第368页的第14.7.3节("显式专门化")开始:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf(这是一个半最新的草案,但不是最新的。但是它是免费的。)

正如其他答案所示:

  • 你的专门化语法错误
  • 不能部分专门化模板函数

…有人知道修复/解决这个问题吗?

由于在实参列表中使用模板实参,因此可以使用重载函数。

template <class T>
void f(const T& value)
{
    std::cout << "DEFAULT" << std::endl;
}
void f(const MyClass& value)
{
    std::cout << "MyClass" << std::endl;
}
template <class T>
void f(const std::vector<T>& v) // this is an overload, not a specialization
{
    std::cout << "vector" << std::endl;
}
int main()
{
    f(1);
    MyClass2 e;
    f(e);
    f(std::vector<int>());
}

专门化语法错误。

可能,它应该是这样的:

// MyClass
class MyClass{
virtual void a() = 0;
};
class MyClass2 : public MyClass{
    void a(){}
};
// template definition
template< class T >
void f(const T& value)
{
    cout << "DEFAULT" << endl;
};
// specialization for MyClass
template<>
void f(const MyClass & value)
{
    cout << "MyClass" << endl;
};
// specialization for vector of MyClass
template<>
void f(const std::vector<MyClass> & v)
{
    cout << "vector" << endl;
}
int main()
{
    // Using template for any type
    f(2);
    // Using specialization for MyClass
    MyClass2 e;
    f<MyClass>(e);
    // Using specialization for vector<MyClass>
    vector<MyClass> vM;
    f(vM);
}