gpt4 book ai didi

C++ 模板特化和继承

转载 作者:太空狗 更新时间:2023-10-29 20:37:42 25 4
gpt4 key购买 nike

我有一段代码,它应该声明基本结构,然后声明从它继承的模板结构。然后该结构被部分指定。

#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++ 模板特化和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34064447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com