无法为vector和abstract类专门化模板函数

时间:2014-05-13 17:19:18

标签: c++ visual-studio-2010 templates vector specialization

我正在尝试编写模板函数,但我无法将其专门用于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.0 \ vc \ include \ vector(869):错误C2259:'MyClass':无法实例化抽象类

这似乎非常具体针对这种特殊情况:我一删除const修饰符,就会将vector更改为list或我MyClass具体,一切正常。但对于我的问题,我需要这种特殊情况才能奏效。

是否有人和我有同样的错误,更重要的是有人知道修复/解决方法吗?

3 个答案:

答案 0 :(得分:0)

您在专业化语法方面存在错误。

可能看起来应该是这样的:

// 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);
}

答案 1 :(得分:0)

我相信:

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

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

还有一些关于Stack Overflow的其他问题涉及类似代码和类似问题。这个(和获胜的答案)似乎非常相关:Why function template cannot be partially specialized?

如果您感觉特别自虐,您可以自己仔细阅读C ++标准。您可以从本文档第368页的第14.7.3节(&#34;明确的专业化&#34;)开始:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf(这是一个半近期草案,但不是最新的草稿。它是但是,免费。)

答案 2 :(得分:0)

正如其他答案所示:

  • 您的专业化语法错误​​
  • 您不能部分专门化模板功能
  

...有人知道修复/解决方法吗?

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

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>());
}