可视化C++模板专业化和继承
visual C++ template specialisation & inheritance
我有一段代码,它应该声明基结构,然后声明从中继承的模板结构。然后该结构被部分指定。
#include <utility>
#include <iostream>
template<class A, class B>
struct Parent {
std::pair<A, B> m_pair;
void print() {
std::cout << m_pair.first << ", " << m_pair.second << "n";
}
};
template <class A, class B>
struct Some : public Parent<A, B> {
Some(A a, B b) : Parent<A, B>({ {a, b} }) {}
void add() {
m_pair.first += m_pair.second;
}
};
template <class B>
struct Some<B, float> : public Parent<B, float> {
Some(B a, float b) : Parent<B, float>({ {a, b} }) {}
void add() {
m_pair.first -= m_pair.second;
}
};
int main() {
Some<int, float> s(4, 42);
s.add();
s.print();
return 0;
}
当我在Visual Studio 2015中编译它时,一切都编译得很好,工作正常。然而,当我用GCC 5.2.1或clang 3.6编译时,我会得到以下错误:
untitled.cpp: In member function ‘void Some<A, B>::add()’:
untitled.cpp:17:9: error: ‘m_pair’ was not declared in this scope
m_pair.first += m_pair.second;
^
untitled.cpp: In member function ‘void Some<B, float>::add()’:
untitled.cpp:24:9: error: ‘m_pair’ was not declared in this scope
m_pair.first += m_pair.second;
怎么了?然而,当我将m_pair
称为Parent<A, B>::m_pair
时,它在GCC和clang中起作用。
定义指定模板冲突的正确方法是什么(使用指定方法),这些方法有共同的方法?
由于基类依赖于模板参数,因此在非限定名称查找过程中不会检查基成员。
幸运的是,修复很容易:只需在基本成员访问的前缀上加上this->
:
this->m_pair.first += this->m_pair.second;
this->m_pair.first -= this->m_pair.second;
这个将在基类中查找,这样就会找到成员。
不合格查找在MSVC中有效,因为该编译器在其模板实现的许多方面都是不一致的。
相关文章:
- 继承函数的重载解析
- 如何使用默认参数等选择模板专业化
- 继承期间显示未知行为的子类
- 模板化建造师专业化
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 继承专业化的模板参数推导
- 从特定专业化继承时可访问的模板基类?
- 如何在部分类模板专业化中实现继承
- 继承成员功能的模板专业化
- 可视化C++模板专业化和继承
- 来自不同专业化的模板类继承