C++ c4930可能存在的编译器错误

C++ c4930可能存在的编译器错误,c++,visual-studio,warnings,C++,Visual Studio,Warnings,我只是想把这篇文章贴在这里,以确保我没有遗漏一些非常明显的东西(因此会觉得很傻)。这是我写的一些代码的简化版本 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: N

我只是想把这篇文章贴在这里,以确保我没有遗漏一些非常明显的东西(因此会觉得很傻)。这是我写的一些代码的简化版本

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;
}
模板
班级合作{
公众:
COORD(T dim0){m_数据[0]=dim0;}
私人:
T m_数据[NDIM];
};
模板
类节点{
公众:
节点(const-COORD&c=COORD()):m_-COORD(c){}
私人:
库德·穆库德;
};
int main()
{
常数int VAL=10;
节点n(COORD(VAL));//警告c4930???
节点n2(COORD(10));
坐标c(VAL);
节点n3(c);
返回0;
}
语句“NODEn(COORD(VAL));”给出:

警告C4930:'NODE n(COORD)':未调用原型函数
(是否打算使用变量定义?)
具有
[
协调,
NDIM=1
]
但是,“n2”和“n3”的DECL编译良好。这是VC2008和VC2010,我还没有试过VC2012。这段代码似乎在GCC4.5.3上编译得很好。

这就是众所周知的。您可能认为您正在创建一个临时对象并使用它初始化一个变量;但是编译器将其解释为函数声明。 具体地说,
n
是一个函数,它返回
节点
,获取一个参数,该参数是指向一个函数的指针,该函数获取一个名为
VAL
(缺少类型说明符)的参数,并返回
坐标

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

NODE< COORD<1> > n( ( COORD<1>( VAL ) ) );
                    ^                 ^
NODEn((COORD(VAL));
^                 ^

看起来是最麻烦的解析。出于某种原因,它似乎将n作为函数原型。可能其他人也是,只是警告一次而已。BTW:这是什么:
const COORD&c=COORD()
不应该是
const COORD&c=COORD()
或类似的东西吗?如果您已经声明了一个非默认构造函数,那么COORD是否有一个默认构造函数?
NODE< COORD<1> > n( ( COORD<1>( VAL ) ) );
                    ^                 ^