当前位置:  开发笔记 > 编程语言 > 正文

C++模板专业化和继承

如何解决《C++模板专业化和继承》经验,为你挑选了1个好方法。

我有一段代码,它应该声明基础结构,然后声明继承它的模板结构.然后结构部分被证明.

#include 
#include 

template
struct Parent {
    std::pair m_pair;
    void print() {
        std::cout << m_pair.first << ", " << m_pair.second << "\n";
    }
};

template 
struct Some : public Parent {
    Some(A a, B b) : Parent({ {a, b} }) {}
    void add() {
        m_pair.first += m_pair.second;
    }
};

template 
struct Some : public Parent {
    Some(B a, float b) : Parent({ {a, b} }) {}
    void add() {
        m_pair.first -= m_pair.second;
    }
};

int main() {
    Some 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::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::add()’:
untitled.cpp:24:9: error: ‘m_pair’ was not declared in this scope
         m_pair.first += m_pair.second;

怎么了?然而,当我提到 m_pairParent::m_pair它在GCC和铿锵.

定义特定模板clasess(使用特定方法)的正确方法是什么,它们共享常用方法?



1> TartanLlama..:

由于基类依赖于模板参数,因此在非限定名称查找期间不会检查基本成员.

幸运的是,修复很简单:只需在基本成员访问前添加this->:

this->m_pair.first += this->m_pair.second;
this->m_pair.first -= this->m_pair.second;

在基类中查找,因此将找到该成员.

非限定查找在MSVC中有效,因为该编译器在其模板实现的许多方面都不符合要求.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有