【问题标题】:Can the "using" declaration be used with templates?“使用”声明可以与模板一起使用吗?
【发布时间】:2008-12-06 20:06:05
【问题描述】:

是否可以在模板基类中使用“使用”声明?我读过它不是here,但这是因为技术原因还是违反了 C++ 标准,它是否适用于 gcc 或其他编译器?如果不可能,为什么不呢?

示例代码(来自上面的链接):

struct A {
    template<class T> void f(T);
};

struct B : A {
    using A::f<int>;
};

【问题讨论】:

  • 您能否为您的问题添加更多信息?你认为什么是非法的?该链接未提及模板
  • Jared,我已经更正了链接。
  • 是的,抱歉,我从地址栏复制了链接,发错了。

标签: c++ templates gcc using


【解决方案1】:

您链接到的是 using 指令。 using 声明可以很好地与模板化基类一起使用(尚未在标准中查找它,只是用编译器对其进行了测试):

template<typename T> struct c1 { 
    void foo() { std::cout << "empty" << std::endl; } 
}; 

template<typename T> struct c2 : c1<T> { 
    using c1<T>::foo; 
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2<void> c;
    c.foo();
    c.foo(10); 
}

编译器正确找到了无参数的foo函数,因为我们的using-declaration将它重新声明到c2的范围内,并输出预期的结果。

编辑:更新了问题。这是更新的答案:

这篇文章是正确的,您不能使用模板 ID(模板名称和参数)。但是你可以放一个模板名称:

struct c1 { 
    template<int> void foo() { std::cout << "empty" << std::endl; } 
}; 

struct c2 : c1 { 
    using c1::foo; // using c1::foo<10> is not valid
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2 c;
    c.foo<10>();
    c.foo(10); 
}

【讨论】:

  • 这是另一回事。 OP 可能意味着驻留在基类中的成员函数模板。
  • 对不起,我是新手。是否可以从 c2 方法中调用 foo 而不必指定基类,即“foo()”而不是“c1::foo()”?
  • Sydius,是的,你这样做->foo(); foo 在基类中,并且依赖于模板参数。标准规定调用必须使用范围运算符 (c1::foo()) 或使用 this->foo(); 进行限定。否则它假定“foo”是一个全局函数
猜你喜欢
  • 2012-05-24
  • 2018-11-05
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2015-05-26
相关资源
最近更新 更多