c++ - 潜在的 g++ 模板错误?

标签 c++ templates g++

我遇到了一些我认为应该编译但没有编译的代码。所以我希望 SO 的一些本地标准专家可以提供帮助:-)。

我基本上有一些类似这样的代码:

#include <iostream>

template <class T = int>
class A {
public:
    class U {
    };

public:
    U f() const { return U(); }
};

// test either the work around or the code I want...
#ifndef USE_FIX
template <class T>
bool operator==(const typename A<T>::U &x, int y) {
    return true;
}
#else
typedef A<int> AI;
bool operator==(const AI::U &x, int y) {
    return true;
}
#endif

int main() {
    A<int> a;
    std::cout << (a.f() == 1) << std::endl;
}

所以,描述一下这里发生了什么。我有一个类模板 (A),它有一个内部类 (U) 和至少一个可以返回该内部类实例的成员函数 (f ()).

然后我尝试创建一个 operator== 函数,该函数将此内部类型与其他类型(在本例中为 int 进行比较,但它似乎不是重要)。

USE_FIXnot 定义时,我收到以下错误:

test.cc: In function 'int main()':
test.cc:27:25: error: no match for 'operator==' in 'a.A<T>::f [with T = int]() == 1'

这看起来很奇怪,因为我显然(我认为)定义了一个模板化的 operator== 应该涵盖这一点,事实上,如果我只是为编译器做一些工作(启用 USE_FIX ),然后我不再收到错误消息。不幸的是,“修复”通常不起作用,仅适用于模板的特定实例化。

这应该像我预期的那样工作吗?还是根本不允许这样做?

顺便说一句:如果重要的话,我使用的是 gcc 4.5.2。

最佳答案

const typename A<T>::U &x 的问题是U是依赖类型,编译器无法推断 T从论点(这是非推断上下文之一)。

例如,您可以有两个特化 A :

class X { };
class Y { };
class Z { };

template <> class A<X> {
public: 
    typedef Z U;
};

template <> class A<Y> {
public:
    typedef Z U;
};

如果你再打电话:

Z a;
a == 1;

编译器应该推导出什么 T作为? X ? Y ?

在这种特殊情况下,一个解决方案是声明 operator==作为类模板中的非模板 friend :

template <class T = int>
class A {
public:
    class U {
    };

    friend bool operator==(const U& x, int y) {
        return true;
    }

public:
    U f() const { return U(); }
};

关于c++ - 潜在的 g++ 模板错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677728/

相关文章:

c++ - VideoInfoHeader2结构时抓帧

c++ - ublas 矩阵表达式教程/示例

c++ - 我应该如何以及何时在 cuda API 中使用倾斜指针?

c++ - 从模板基类派生的类的隐式转换

c++ - 菜鸟的快速 g++ 错误诊断

c++ - 如何在Boost asio多线程服务器的单线程中取消所有异步操作?

c++ - 关于 C++ 中模板上重载运算符的一些编译器错误

c++ - 模板函数调用被函数混淆,在模板之前声明了错误的签名

C++ 错误 : expected primary-expression before '(' token

C++:什么 GNU G++ 参数?