Tag: 名称查找

为什么这个从属名称查找find一个全局标识符而不是方法?

当编译器试图parsingi.template hi<T>(); 它发现hi在全球命名空间,而不是在i ( ideone )的方法hi 。 为什么? #include <cstdio> // Define 'hi' and 'bye' in the global namespace; these should *not* be used template<typename T> struct hi { }; template<typename T> struct bye { }; // Foo needs to be templated for Foo::Inner to be a dependent type (I think) template<typename T> struct Foo […]

条件运算符的返回types和两阶段查找

考虑下面的代码片段: struct Base { }; struct Derived : Base { }; void f(Base &) { std::cout << "f(Base&)\n"; } template <class T = int> void g() { Derived d; f(T{} ? d : d); // 1 } void f(Derived &) { std::cout << "f(Derived&)\n"; } int main() { g(); } 在这种情况下,我认为应该在第一阶段调用f的函数,因为它的参数types是不可信的Derived& ,因此被parsing为f(Base&) ,它是唯一的范围。 铿锵3.8.0与我同意 ,但GCC […]

什么是在一个类中定义的朋友函数的完全限定名?

什么是在一个类中定义的朋友函数的完全限定名? 我最近看到一个类似于以下的例子。 什么是val()的完全限定名? #include <iostream> namespace foo { class A { int x; public: A(int x = 0) : x(x) { } friend int val(const A &a) { return ax; } }; } int main() { foo::A a(42); // val() found using ADL: std::cout << val(a) << std::endl; // foo::val(a); // error: 'val' is not […]

GCC问题:使用依赖于模板参数的基类成员

下面的代码不能用gcc编译,而是用Visual Studio编译: template <typename T> class A { public: T foo; }; template <typename T> class B: public A <T> { public: void bar() { cout << foo << endl; } }; 我得到的错误: test.cpp:在成员函数'void B :: bar()'中: test.cpp:11:错误:'foo'未在此范围内声明 但应该是! 如果我改变bar void bar() { cout << this->foo << endl; } 那么它编译,但我不认为我必须这样做。 在C ++的官方规范中是否有这样的东西,GCC在这里,还是只是一个怪癖?

将“typedef”从基础传播到“模板”的派生类

我试图定义基类,其中只包含typedef。 template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // fails – Vec_t is not recognized }; 为什么在BI中收到一个错误,Vec_t无法识别,我需要明确写入? typename A<T>::Vec_t v;

派生到基类成员数据的模板类访问

这个问题是在这个线程中提出的问题的进一步推动。 使用以下类定义: 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) : […]