我正在尝试编写模板函数,但我无法将其专门用于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;
}
MyClass
和MyClass2
定义为:
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
具体,一切正常。但对于我的问题,我需要这种特殊情况才能奏效。
是否有人和我有同样的错误,更重要的是有人知道修复/解决方法吗?
答案 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>());
}