我想做的:一个简单的存储类,定义为尽可能通用的模板。并且能够从此类派生出另一个可以接受任何内容的类,将其转换为 int
(算法与此处无关),并将其存储在基础类中。
但是,这并不像预期的那样有效。这是我写的最小测试用例:
template<typename T>
class A {
public:
void f(T& foo) { }
};
class B : public A<int> {
public:
template<typename T>
void f(T& foo) { }
};
int main() {
A<int>* ptr = new B;
ptr->f("foo");
delete ptr;
return 0;
}
当然,这是行不通的:
pierre@raringbeast:~/Workspace/Test/src$ icpc -o Test Test.cpp
Test.cpp(16): error: a reference of type "int &" (not const-qualified) cannot
be initialized with a value of type "const char [4]"
ptr->f("foo");
^
compilation aborted for Test.cpp (code 2)
有没有办法强制编译器使用 B 类中的方法定义,或者这是一个真的坏主意?
--
编辑:将继承公开。
最佳答案
首先,正如@GermanDiago 指出的那样,您正在使用私有(private)继承,因此您会遇到“基类不可访问”错误。更改 B
从 A<int>
派生公开。
即便如此,这也无法解决问题。名称查找基于静态类型。当你有一个指向 A<int>
的指针时, 通过该指针访问成员只会查看 A<int>
的成员.
您必须通过类型 B
访问看B
的成员:
int main() {
B* ptr = new B;
ptr->f("foo");
delete ptr;
return 0;
}
当然,如果我没有正确理解你的问题,这并不是你真正想要的。你可能会看看 Curiously Recurring Template Pattern相反。
template <class T, class Derived>
class A {
public:
template <class U>
void f(U& bar) {
static_cast<Derived*>(this)->f(bar);
}
void f(T& foo) {
}
};
class B : public A<int, B>
{
public:
template <class T>
void f(T &foo) {
//will be called from A's f(U&)
}
};
int main() {
A<int, B>* ptr = new B;
ptr->f("foo");
delete ptr;
return 0;
}
当然,这有一个缺点 B
成为 A
的一部分的类型。我认为没有办法在仍然保持编译时间的情况下解决这个问题。
关于c++ - 具有不同签名的多态性和重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268370/