我只是想把这个贴在这里,以确保我没有遗漏一些完全明显的东西(因此会觉得很傻)。这是我写的一些代码的简化版本。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 > n( COORD( 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' 的声明编译得很好。这是 VC2008 和 VC2010,我还没有尝试过 VC2012。这段代码似乎在 GCC 4.5.3 上编译得很好。 最佳答案 这被称为 "most vexing parse" 。您可能认为您正在创建一个临时对象并使用它来初始化一个变量;但编译器将其解释为函数声明。具体来说, n 是一个返回 NODE<COORD<1>> 的函数,采用一个参数,该参数是一个指向函数的指针,该函数采用名为 VAL 的参数(缺少类型说明符),并返回 COORD<1> 。您可以通过添加括号来修复它,这样它就不会被解释为函数声明:NODE< COORD<1> > n( ( COORD<1>( VAL ) ) ); ^ ^关于c++ - c4930 可能的编译器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12041509/
10-13 08:12