4

以下代码是否应该在 C++98/03 中编译?

struct Base
{
    template <typename T> void func () { }
    void norm() {  }
};

struct Derived : public Base { };

template <typename U>
struct Usage
{
    typedef void (U::*Method)();

    Usage(Method test) { }
};

int main()
{
    Usage<Derived> good(&Derived::norm);

    // "Error: Cannot use void(*)() to initialize Usage<Derived>." on next line
    Usage<Derived> bad(&Derived::func<int>);

    return 0;
}

这个代码片段在我能够尝试的几乎所有编译器上都运行良好;保存 Sun C++ 5.11 和 Sun C++ 5.12。

那应该是一个错误吗?如果是这样,有谁知道它是否已报告给供应商(目前是 Oracle)?

编辑:

我将接受从 C++03 或 C++11 标准文档中提供适当相关引用的答案。或者,如果您可以提供有关 Oracle 错误报告的信息。

4

1 回答 1

0

我刚刚阅读了 C++98 标准的大部分内容,第 14 章。关于生成(专用)模板成员的类型并没有太多说明,所以我认为它遵循这样的想法,即作为模板方法不会使它不再是一种方法。如果我有时间,我会看看 C++11 是否对此有更多说明。

根据我对 C++ 的总体想法,我知道您的代码应该通过 - 大多数编译器都同意这一点也是一个线索,不是吗?:)

于 2013-03-26T04:32:33.393 回答