4

我只是想在这里发布这个以确保我没有遗漏一些完全明显的东西(因此会觉得很傻)。这是我编写的一些代码的简化版本。

template <int NDIM, typename T = int>
class COORD {
public:
    COORD(T dim0) { m_data[0] = dim0; }
private:
    T m_data[NDIM];
};

template <class COORD>
class NODE {
public:
    NODE(const COORD& c = COORD()) : m_coord(c) {}
private:
COORD m_coord;
};

int main()
{
    const int VAL = 10;
    NODE< COORD<1> > n( COORD<1>( VAL ) ); // warning c4930???
    NODE< COORD<1> > n2( COORD<1>( 10 ) );
    COORD<1> c( VAL );
    NODE< COORD<1> > n3( c );
    return 0;
}

语句“NODE<COORD<1> > n(COORD<1>(VAL));” 给出:

warning C4930: 'NODE<COORD> n(COORD<NDIM>)': prototyped function not called
(was a variable definition intended?)
    with
    [
        COORD=COORD<1>,
        NDIM=1
    ]

但是,'n2' 和 'n3' 的 decl 编译得很好。这是 VC2008 和 VC2010,我还没有尝试过 VC2012。这段代码似乎在 GCC 4.5.3 上编译得很好。

4

1 回答 1

11

这被称为“最令人头疼的解析”。您可能认为您正在创建一个临时对象并使用它来初始化一个变量;但编译器将其解释为函数声明。具体来说,n是一个返回的函数NODE<COORD<1>>,它接受一个参数,该参数是一个指向一个函数的指针,该函数接受一个名为VAL(缺少类型说明符)的参数,并返回COORD<1>

您可以通过添加括号来修复它,这样它就不会被解释为函数声明:

NODE< COORD<1> > n( ( COORD<1>( VAL ) ) );
                    ^                 ^
于 2012-08-20T16:35:52.917 回答