我从这里得到了代码.
class Timer {
public:
Timer();
};
class TimeKeeper {
public:
TimeKeeper(const Timer& t);
int get_time()
{
return 1;
}
};
int main() {
TimeKeeper time_keeper(Timer());
return time_keeper.get_time();
}
Run Code Online (Sandbox Code Playgroud)
从它的外观来看,由于该行应该会出现编译错误:
TimeKeeper time_keeper(Timer());
Run Code Online (Sandbox Code Playgroud)
但只有在return time_keeper.get_time();存在的情况下才会发生 .
为什么这条线甚至很重要,编译器会发现time_keeper(Timer() )构造上的含糊不清.
使用g ++ 4.6编译的以下程序会产生错误
request for member ‘y’ in ‘a2’, which is of non-class type ‘A<B>(B)’
Run Code Online (Sandbox Code Playgroud)
在最后一行:
#include <iostream>
template <class T> class A
{
public:
T y;
A(T x):y(x){}
};
class B
{
public:
int u;
B(int v):u(v){}
};
int main()
{
int v = 10;
B b1(v);
//works
A<B> a1(b1);
//does not work (the error is when a2 is used)
A<B> a2(B(v));
//works
//A<B> a2((B(v)));
std::cout << a1.y.u << " " << a2.y.u << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
从代码中包含的工作变量可以看出,在A的构造函数的参数周围添加括号可以解决问题.
我已经看到一些由构造函数调用解释为函数声明引起的相关错误,比如在创建一个没有参数的构造函数的对象时,但是使用大括号:
myclass …Run Code Online (Sandbox Code Playgroud)