这个问题是一个在问的赞助这个线程.
使用以下类定义:
template <class T>
class Foo {
public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;
};
template <class T>
class Bar : public Foo<T> {
public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo<T>::Foo_T = T(a_arg);
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo<T>::Foo_T = T(b_arg);
} …Run Code Online (Sandbox Code Playgroud) 上下文:
受保护和公共类成员的继承是面向对象编程的基本概念.下面的简单示例说明了一个经常遇到的情况,其中类CDerived继承了类的所有公共成员,CBase并添加了自己的1个附加函数,而不更改或显式重新定义或重新定义类的任何公共成员CBase.
#include <stdio.h>
class CBase
{
public:
char Arr[32];
int Fn1(void) {
return Arr[1] ^ Arr[sizeof(Arr)-1];
}
int Fn2(void) {
return Arr[2] ^ Arr[sizeof(Arr)-2];
}
};
class CDerived : public CBase
{
public:
int FnSum(void) {
return Fn1() + Fn2();
}
};
int main(void)
{
CDerived ddd;
printf("%d\n", ddd.Fn1());
printf("%d\n", ddd.Fn2());
printf("%d\n", ddd.FnSum());
return (int)ddd.Arr[0];
};
Run Code Online (Sandbox Code Playgroud)
上面的代码在所有主要编译器上编译都没有问题.
但是,如果希望" 模板化 "此代码,例如:通过参数化Arr数组的大小,那么CBase类模板的所有公共成员对CDerived符合最新C++标准的编译器上的类模板都是不可见的.
以下是问题代码:
#include <stdio.h>
template …Run Code Online (Sandbox Code Playgroud) 可能的重复:
GCC问题:使用依赖于模板参数的基类成员
为什么当VS没有时,GCC在模板中需要额外的声明?
为什么派生模板类不能访问基本模板类
iphone编译器继承模板化基类,传递类型未及时扩展(只看)
抱歉这个令人困惑的标题,我能想出最好的.
这里有一些代码来说明我的问题......
基本模板类:
template<class T> class TestBase
{
public:
int someInt;
};
Run Code Online (Sandbox Code Playgroud)
试图用另一个模板类继承TestBase ...
这在编译时得到"someInt未在此范围内声明":
template<class X> class TestSub : public TestBase<X>
{
void testf()
{
someInt = 0; //Error: "someInt was not declared in this scope"
}
};
Run Code Online (Sandbox Code Playgroud)
B)这很好用(不同之处在于我明确指定了TestBase的模板输入)
template<class X> class TestSub : public TestBase<string>
{
void testf()
{
someInt = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
为什么(A)的TestSub没有像(B)中那样正确地继承someInt?
提前致谢.
可能重复:
[FAQ] 为什么派生模板类不能访问基本模板类的标识符? c ++中基类中受保护字段的问题
无法访问类模板中的数据成员
以下代码给出了编译错误.怎么了?
struct Base {
int amount;
};
template<class T> struct D1 : public Base {
};
template<class T>
struct D2 : D1<T> {
void foo() { amount=amount*2; /* I am trying to access base class data member */ };
};
int main() {
D2<int> data;
};
test.cpp: In member function 'void D2<T>::foo()':
test.cpp:11: error: 'amount' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
谢谢
所以,假设您有一个递归的基类(例如链表)和派生类.派生类应该重用基类中的构造函数,因为您不想编写冗余代码.你可以尝试一下这个显而易见的事情,它不会起作用:
class Base {
public:
Base(int size) {
if (size <= 0) { next = NULL; }
else { next = new Base(size - 1); }
}
void print() {
cout << " Base ";
if (next != NULL) { next->print(); }
}
protected:
Base *next;
};
class Derived: public Base {
public:
Derived(int size) : Base(size) {}
void print()
{
cout << " Derived ";
if (next != NULL)
{ next->print(); }
}
};
int main()
{
Derived d2(5); …Run Code Online (Sandbox Code Playgroud) 我有一些这样命名的常量:
template<int n> class usart {
private:
usart();
public:
enum class tx {};
enum class rx {};
enum class ck {};
};
template<> class usart<1> {
public:
enum class tx { A9 = gpio::A9, C4 = gpio::C4 };
enum class rx { A10 = gpio::A10, C5 = gpio::C5 };
enum class ck { A8 = gpio::A8 };
};
// two more of these
Run Code Online (Sandbox Code Playgroud)
where gpio只是一个简单的整数枚举.
我想在另一个文件中对我的类强制执行某些类型的安全性:
class USART {
public:
template<int N>
USART(typename usart<N>::tx pin_tx, typename usart<N>::rx pin_rx) { …Run Code Online (Sandbox Code Playgroud) 此代码在GNU编译器中产生错误:
class A
{
public:
int X;
};
template<class T>
class Foo : public T
{
public:
void doStuff();
};
template<class T>
void Foo<T>::doStuff()
{
X++;
}
Run Code Online (Sandbox Code Playgroud)
已经有一个答案为什么这是一个错误.我想知道是否有另一种解决此错误的方法而不是使用
T::X
Run Code Online (Sandbox Code Playgroud)
每次我想引用X成员.我试过这个:
template<class T>
void Foo<T>::doStuff()
{
using T::X;
X++;
}
Run Code Online (Sandbox Code Playgroud)
但是GCC给出了一个错误:"不允许使用类限定名称"
c++ ×7
templates ×7
inheritance ×5
c++11 ×1
compilation ×1
gcc ×1
name-lookup ×1
recursion ×1
scope ×1