无法为向量和抽象类特化模板函数
unable to specialize template function for both vector and abstract class
我试图写一个模板函数,但我有麻烦专门化它为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.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);
}
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 将自定义函数传递到基抽象类中以延迟执行
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 抽象类和构造函数
- C++ 将一组对象传递给抽象类的成员函数
- 抽象类析构函数与继承"Shutdown"函数
- 尝试在 std::map 中插入抽象类时没有用于调用的匹配函数
- C++的抽象类继承和构造函数的问题
- C++ abort() 在函数内的抽象类对象指针调用上
- 具有继承类和函数的抽象类写入单独的向量c++
- C++ 抽象类构造函数调用
- 为什么不能将std :: async用于接收对抽象类作为参数的函数
- 抽象类和虚拟构造函数的替代方案
- 抽象类的复制构造函数中的问题
- C++ 接受对抽象类的常量引用的构造函数无法初始化 std::map
- 抽象类对象和纯虚拟析构函数
- 无法绑定 c++ 中抽象类中的函数
- 本地抽象类的纯虚拟析构函数