Mar*_*rkB 4 c++ warnings visual-studio
我只想在这里发帖,以确保我不会错过任何完全明显的东西(因此会觉得非常愚蠢).这是我写的一些代码的简化版本.
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;
}
Run Code Online (Sandbox Code Playgroud)
声明"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
]
Run Code Online (Sandbox Code Playgroud)
但是,'n2'和'n3'的decls编译得很好.这是VC2008和VC2010,我还没试过VC2012.这段代码似乎可以在GCC 4.5.3上正常编译.
Mik*_*our 11
这被称为"最令人烦恼的解析".您可能认为您正在创建一个临时对象并使用它来初始化变量; 但编译器将其解释为函数声明.具体来说,n是一个函数返回NODE<COORD<1>>,取一个参数,该参数是一个函数的指针,该函数采用一个被调用的参数VAL(带有缺少的类型说明符),然后返回COORD<1>.
您可以通过添加括号来修复它,因此它不会被解释为函数声明:
NODE< COORD<1> > n( ( COORD<1>( VAL ) ) );
^ ^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |