同一个模板的多个专门化在单个类中具有不同的类型名
Multiple specializations of the same template with different typenames in a single class
我正在实现一个观察者模式作为模板,并希望一个类具有不同的侦听器类型被附加。问题是,似乎不可能在一个类中多次使用不同类型的相同模板。据我所知,这应该是可能的,因为方法名无论如何都会有不同的类型,所以它们应该被分解成不同的名称。然而,我得到的错误不是在链接时,而是在编译时,所以我想知道我做错了什么,或者如果这是不可能的。
为了演示这个问题,我编写了一个SSCE:#include <iostream>
#include <string>
template<typename T>
class Comparator
{
public:
Comparator(void) { mCounter = 0; };
virtual ~Comparator(void) {};
bool equals(T oFirst, T oSecond)
{
mCounter++;
if(oFirst != oSecond)
return false;
return true;
}
int getCounter(void)
{
return mCounter;
}
private:
int mCounter;
};
class TestClass :
public Comparator<int>,
public Comparator<void *>
{
public:
TestClass(void) {};
virtual ~TestClass(void) {};
};
int main(int argc, char *argv[])
{
TestClass t1;
TestClass *t2 = &t1;
TestClass *t3 = new TestClass();
int v1 = 1;
int v2 = 2;
bool b = t1.equals(v1, v2);
std::cout << b << std::endl;
std::cout << t1.equals(&t1, &t2) << std::endl;
std::cout << t1.getCounter() << std::endl;
delete t3;
return 0;
}
当我用gcc(使用Cx11选项)编译这个时,我得到以下错误:
||=== Build: Debug in CPPMingW (compiler: GNU GCC Compiler) ===|
D:srccTestsCPPMingWmain.cpp||In function 'int main(int, char**)':|
D:srccTestsCPPMingWmain.cpp|38|error: request for member 'equals' is ambiguous|
D:srccTestsCPPMingWmain.cpp|12|note: candidates are: bool Comparator<T>::equals(T, T) [with T = void*]|
D:srccTestsCPPMingWmain.cpp|12|note: bool Comparator<T>::equals(T, T) [with T = int]|
D:srccTestsCPPMingWmain.cpp|38|error: expected primary-expression before 'int'|
D:srccTestsCPPMingWmain.cpp|38|error: expected ';' before 'int'|
D:srccTestsCPPMingWmain.cpp|39|error: request for member 'equals' is ambiguous|
D:srccTestsCPPMingWmain.cpp|12|note: candidates are: bool Comparator<T>::equals(T, T) [with T = void*]|
D:srccTestsCPPMingWmain.cpp|12|note: bool Comparator<T>::equals(T, T) [with T = int]|
D:srccTestsCPPMingWmain.cpp|35|warning: unused variable 'v1' [-Wunused-variable]|
D:srccTestsCPPMingWmain.cpp|36|warning: unused variable 'v2' [-Wunused-variable]|
||=== Build failed: 4 error(s), 2 warning(s) (0 minute(s), 1 second(s)) ===|
在这个例子中,我真的不明白为什么它应该是模棱两可的,因为在两个调用中,数据类型都定义得很好,与其他模板专门化完全不同。我希望getCounter()
的错误,因为这真的是不可确定的。
您希望基类中的equals
参与重载解析,就像它们都在派生类中定义一样,但不幸的是它不这样工作(我不确定为什么不这样做)。
您可以显式调用您想要的equals
版本:
t1.Comparator<int>::equals(v1, v2);
或者你可以把它添加到你的派生类(公共部分):
using Comparator<int>::equals;
using Comparator<void*>::equals;
允许基类中的2个equals函数执行标准的重载解析。您也可以通过在派生类中编写两个equals函数并让每个函数调用适当的基类equals
来实现相同的事情。
只是要注意:Comparator<int>
和Comparator<void*>
是完全独立的类。他们彼此一无所知。如果它们不是模板但有不同的名称,则行为相同。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- TypeA和TypeB是同一个主类型的别名,如何在C++模板中将它们推导为不同的类型
- 如何在同一个模板功能上专门化几种类型?
- 将多个类型存储到同一个容器中
- 在c++中,如何在另一个嵌套类中使用嵌套类类型(两个嵌套类在同一个外部类下)
- 同一个模板的多个专门化在单个类中具有不同的类型名
- 同一个类型限定符被多次使用